시작 전
- 코로나로 인해 재택근무량이 이전에 비해 폭발적으로 늘어났다. 기업은 재택근무시에도 보안적으로 안전하고 탄력적으로 제공할 수 있는 Amazon WorkSpaces 도입을 고려한다.
- 한층 강화된 접속 인증을 위해서 MFA 설정을 통해 사용자가 OTP를 입력해야 WorkSpaces에 로그인 할 수 있는 환경을 만들려고한다.
- WorkSpaces와 AD를 비롯한 준비물이 모두 준비됐다는 가정하에 실습을 진행한다.
- SimpleAD는 MFA연동을 지원하지 않고 Managed AD는 지원한다고 하지만 실습과정중 실패해서 AD Connector만 이 방식으로 연동이 가능했다.
솔루션 개요
다음은 Amazon WorkSpaces에서 MFA를 사용할 때의 인증 작동 방식입니다.
- 1 & 2 단계 : Amazon WorkSpaces 사용자는 Google Authenticator와 같은 인증 앱에서 OTP를 받는다.
- 3 단계 : WorkSpaces 클라이언트는 첫 번째 도메인 사용자 이름&암호와 두 번째 OTP를 모두 AWS Directory Service에 보낸다.
- 4 & 5 단계 : Active Directory는 '온프렘의 AD Connector' 혹은 'AWS Managed AD의 AWS Managed Domain Controllers'에 대해 필수 인증을 검증한다 → 이부분은 해석이 애매하고 AD Connector를 통해서만 실습에 성공했다. (Managed AD는 마지막 MFA 등록과정에서 fail)
- 6 단계 : Active Directory는 OTP를 RADIUS 서버로 전송
- 7 단계 : RADIUS 서버는 OTP를 확인하고 올바른 경우 '성공'으로 응답
- 8 단계 : AD 커넥터가 인증을 완료하고 고객이 서비스에 액세스 할 수 있다.
결과 미리보기
MFA가 활성화되면 Amazon WorkSpaces 클라이언트 접속창에 MFA 코드 입력칸이 생긴다.
실습
1 단계 : RADIUS 서비스를위한 EC2 인스턴스 준비
RDS로 진행하는 경우는 이 토글을 참고 (MariaDB 사용x)
- EC2에 SSH 연결. 최신 상태인지 확인하고 저장소 활성화합니다.
sudo yum -y update sudo amazon-linux-extras install epel -y sudo yum localinstall http://linotp.org/rpm/el7/linotp/x86_64/Packages/LinOTP_repos-1.1-1.el7.x86_64.rpm -y
- RDS 연동, LinOTP 설정
git clone https://bitbucket.org/snippets/zenliu/XL9ogL/linotp-configure-maria-db-rds.git /root/rds chmod u+x /root/rds/linotp-create-mariadb-rds ./linotp-create-mariadb-rds mfadb.codsl1puweu5.us-west-2.rds.amazonaws.com admin BSGpartners#1 yum install git epel-release -y yum localinstall http://linotp.org/rpm/el7/linotp/x86_64/Packages/LinOTP_repos-1.1-1.el7.x86_64.rpm -y git clone https://github.com/johnalvero/ADConnector-MFA.git /usr/local/ADConnector-MFA
- LinOTP, Apache httpd를 설치 하고 MariaDB 구성
sudo yum install -y LinOTP LinOTP_mariadb sudo restorecon -Rv /etc/linotp2/ sudo restorecon -Rv /var/log/linotp # LinOTP 및 MariaDB 자격 증명 sudo linotp-create-mariadb # python-repoze-who 버전 잠금 sudo yum install yum-plugin-versionlock -y sudo yum versionlock python-repoze-who # apache 및 vhost 구성 설치 sudo yum install LinOTP_apache -y sudo systemctl enable httpd sudo systemctl start httpd sudo mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.back sudo mv /etc/httpd/conf.d/ssl_linotp.conf.template /etc/httpd/conf.d/ssl_linotp.conf #HTTPD 실행시 ssl 인증서 관련 오류가 뜨면 아래 명령 실행 openssl req -new -days 365 -x509 -nodes -newkey rsa:2048 -out /etc/pki/tls/certs/localhost.crt -keyout /etc/pki/tls/private/localhost.key
- EC2에 SSH 연결. 최신 상태인지 확인하고 저장소 활성화합니다.
- EC2에 SSH 연결. 최신 상태인지 확인하고 저장소 활성화합니다.
sudo yum -y update sudo amazon-linux-extras install epel -y sudo yum localinstall http://linotp.org/rpm/el7/linotp/x86_64/Packages/LinOTP_repos-1.1-1.el7.x86_64.rpm -y
- MariaDB 설치 및 서비스 활성화
sudo yum install mariadb-server -y sudo systemctl enable mariadb sudo systemctl start mariadb sudo mysql_secure_installation #엔터->엔터->새 암호->암호 확인->엔터 4번
- LinOTP, Apache httpd를 설치 하고 MariaDB 구성
sudo yum install -y LinOTP LinOTP_mariadb sudo restorecon -Rv /etc/linotp2/ sudo restorecon -Rv /var/log/linotp # LinOTP 및 MariaDB 자격 증명 sudo linotp-create-mariadb # python-repoze-who 버전 잠금 sudo yum install yum-plugin-versionlock -y sudo yum versionlock python-repoze-who # apache 및 vhost 구성 설치 sudo yum install LinOTP_apache -y sudo systemctl enable httpd sudo systemctl start httpd sudo mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.back sudo mv /etc/httpd/conf.d/ssl_linotp.conf.template /etc/httpd/conf.d/ssl_linotp.conf
2 단계 : LinOTP 구성 및 Active Directory와 통합
- LinOTP 관리 포털 암호 설정 → “admin”의 암호를 입력
sudo htdigest /etc/linotp2/admins "LinOTP2 admin area" admin
- 비밀번호를 설정 한 후 인스턴스를 재부팅
- https://[IPofInstance]/manage 접속
- [IPofInstance] : EC2의 Public IP
- admin/바로 위에 설정한 PW 로 로그인
- LinOTP Config 탭 → UserIdResolvers
- New 클릭 → LDAP를 선택합니다.
- 서버 구성 필드 정보 입력. 아래 샘플 참조
- Resolver name : 마음대로
- Server-URI : AD 의 DNS IP (AD connector의 DNS는 connection이 안됐다.)
- BaseDN : AD정보 입력 (
ou=users,ou=[OU이름],dc=[DC이름],dc=com
)
- BindDN : AD정보 입력 (
cn=admin,ou=users,ou=[OU이름],dc=[DC이름],dc=com
)
- BindPassword : BindDN cn의 pw
- Test LDAP Server connection을 클릭 해 LDAP 서버 연결 테스트 → 성공하면 Save하여 Resolver 저장
- Realm 생성 → Resolver를 생성하면 Realms가 없어 자연스럽게 생성 창으로 유도한다.
- OK → New → 원하는 Realm name 입력 후 저장
- 사용자보기User View 탭을 선택하면 Active Directory의 사용자 목록 확인 가능
samplepolicy.cfg
파일을 워드패드에서 생성 후 아래와 같이 작성[Limit_to_one_token] realm = * name = Limit_to_one_token action = maxtoken=1 client = * user = * time = * * * * * *; active = True scope = enrollment [OTP_to_authenticate] realm = * name = OTP_to_authenticate action = otppin = token_pin client = * user = * time = * * * * * *; active = True scope = authentication [Require_MFA_at_Self_Service_Portal] realm = * name = Require_MFA_at_Self_Service_Portal active = False client = * user = * time = * * * * * *; action = mfa_login scope = selfservice [Default_Policy] realm = * name = Default_Policy active = True client = * user = * time = * * * * * *; action = "enrollTOTP, reset, resync, setOTPPIN, disable" scope = selfservice
- Policies 탭 → Import Policies →
samplepolicy.cfg
를 등록
- LinOTP 관리 포털 암호 설정 → “admin”의 암호를 입력
3 단계 : 사용자 등록
- EC2 보안 그룹의 TCP 443, 80 및 UDP 1812 에대한 인바운드 규칙 허용
https://[IPofInstance]
접속 후 Active Directory에 생성한 Username/Password로 로그인- [IPofInstance] : EC2의 Public IP
- Enroll TOTP Token 화면에서 'Generate Random Seed' 및 'Google Authenticator compliant' 체크 후 enroll TOTP token
- QR 코드가 나타나면 Google Authenticator로 스캔해서 추가
https://[IPAddressofRADIUS]/validate/check?user=[USERNAME]&pass=[PINOTP]
로 접속하여 테스트- [IPAddressofRADIUS] : EC2의 Public IP
- [USERNAME] : 테스트할 AD user 이름
- [PINOTP] : Google OTP
- 아래 응답을 받으면 인증에 성공한 것 ( "value" : true )
4 단계 : FreeRADIUS를 설치하고 구성합니다. (EC2 Instance)
- FreeRADIUS 설치 및 구성
sudo yum install freeradius freeradius-perl freeradius-utils perl-App-cpanminus perl-LWP-Protocol-https perl-Try-Tiny git -y sudo cpanm Config::File sudo mv /etc/raddb/clients.conf /etc/raddb/clients.conf.back sudo mv /etc/raddb/users /etc/raddb/users.back
vi /etc/raddb/clients.conf
파일 생성 . 아래 구성을 입력client localhost { ipaddr = 127.0.0.1 netmask= 32 secret = 'MYSECRET' } client adconnector { #<-- 이부분을 adconnector가 아닌 다른이름으로 설정하면 mfa 설정에 fail이 떴음 ipaddr = [CIDR of Directory Service subnets or VPC] # 접속허용하려는 AD의 subnet or VPC netmask = [YOUR-NETMASK] # netmask secret = 'MYSECRET' # MFA인증시에 ' ' 사이의 MYSECRET 값을 사용 } #테스트를 위해 모든 IP열어두는 Client client all { ipaddr = 0.0.0.0 netmask = 0 secret = 'aaaaaaaa' }
- FreeRADIUS 용 linotp perl 모듈 다운로드
sudo git clone https://github.com/LinOTP/linotp-auth-freeradius-perl.git /usr/share/linotp/linotp-auth-freeradius-perl
- FreeRADIUS가 'linotp'플러그인을 실행하도록 허용
vi /etc/raddb/mods-available/perl
# 10000dd 로 모든 내용을 지우고 아래 내용 붙여넣기 perl { filename = /usr/share/linotp/linotp-auth-freeradius-perl/radius_linotp.pm }
- Perl 모듈 활성화
sudo ln -s /etc/raddb/mods-available/perl /etc/raddb/mods-enabled/perl
- FreeRADIUS 용 LinOTP perl 모듈을 구성
vi /etc/linotp2/rlm_perl.ini
#IP of the linotp server URL=https://localhost/validate/simplecheck #optional: limits search for user to this realm REALM=[YOUR-REALM] #<--- 2단계-7. 에서 만든 REALM 입력 #optional: only use this UserIdResolver #RESCONF=flat_file #optional: comment out if everything seems to work fine Debug=True #optional: use this, if you have selfsigned certificates, otherwise comment out SSL_CHECK=False
- 활성화 된 구성에 대한 기본 링크 제거
sudo rm /etc/raddb/sites-enabled/{inner-tunnel,default} sudo rm /etc/raddb/mods-enabled/eap
- 'FreeRADIUS'에서 'linotp' 활성화.
vi /etc/raddb/sites-available/linotp
server default { listen { type = auth ipaddr = * port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { ipaddr = * port = 0 type = acct } authorize { preprocess IPASS suffix ntdomain files expiration logintime update control { Auth-Type := Perl } pap } authenticate { Auth-Type Perl { perl } } preacct { preprocess acct_unique suffix files } accounting { detail unix -sql exec attr_filter.accounting_response } session { } post-auth { update { &reply: += &session-state: } -sql exec remove_reply_message_if_eap } }
/etc/raddb/sites-enabled
의 소프트 링크를 만들어 구성 활성화sudo ln -s /etc/raddb/sites-available/linotp /etc/raddb/sites-enabled/linotp
- Radius 서비스 활성화 및 시작
sudo systemctl enable radiusd sudo systemctl restart radiusd
- FreeRADIUS 설치 및 구성
5 단계 : EC2 인스턴스에서 솔루션 테스트
RADIUS EC2 서버에서 Google 인증 테스트 가능
radtest user01 937212 localhost:1812 10 secretcode
- radtest USERNAME MFACODE PRIVATERADIUSIP:1812 10 SECRETWORD
- USERNAME : 접속할 유저 네임
- MFACODE : Google OTP
- PRIVATERADIUSIP : localhost 입력
- SECRETWORK : /etc/raddb/client.conf 내부의 secret값
- Access-Accept 응답을 받아야 성공
6 단계 : AWS 디렉터리에서 MFA 활성화
- 디렉터리 서비스 콘솔 →MFA를 활성화 할 디렉토리 클릭 → 네트워크 및 보안 탭 → MFA (Multi-Factor Authentication)
- Display label : 원하는 이름
- RADIUS server DNS name or IP addresses : EC2의 사설 IP
- Port : 기본은 UDP/1812
- Shared secret code : EC2의 /etc/raddb/client.conf 에서 설정한 secret 값
- Protocol : PAP
- Server timeout : 30 sec
- Max RADIUS request retries : 3
- MFA 설정에 성공하면 AWS Workspaces에 접속
- 디렉터리 서비스 콘솔 →MFA를 활성화 할 디렉토리 클릭 → 네트워크 및 보안 탭 → MFA (Multi-Factor Authentication)
Uploaded by Notion2Tistory v1.1.0