구름

Amazon WorkSpaces에 MFA 연동하기 본문

Cloud/일반

Amazon WorkSpaces에 MFA 연동하기

Cloudest 2021. 2. 17. 14:43
 

Cloudest - 블로그 이사했습니다

노션으로 블로그를 옮겼습니다.

흥미로운 포스팅이 올라옵니다!

cloudest.oopy.io

 

🛠
준비물
- Amazon WorkSpaces가 구성된 AWS 환경
- AWS Managed AD 또는 AD Connector와 같은 AWS 디렉터리 서비스
- Amazon Linux 2 AMI 기반 EC2 인스턴스
- 스마트폰에 설치된 Google Authenticator
- Amazon RDS (MariaDB대신 RDS를 사용하는경우)

시작 전

  • 코로나로 인해 재택근무량이 이전에 비해 폭발적으로 늘어났다. 기업은 재택근무시에도 보안적으로 안전하고 탄력적으로 제공할 수 있는 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)
      1. 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
      1. 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
      1. 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
        
    1. 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
    1. MariaDB 설치 및 서비스 활성화
      sudo yum install mariadb-server -y
      sudo systemctl enable mariadb
      sudo systemctl start mariadb
      sudo mysql_secure_installation #엔터->엔터->새 암호->암호 확인->엔터 4번
    1. 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와 통합
    1. LinOTP 관리 포털 암호 설정 → “admin”의 암호를 입력sudo htdigest /etc/linotp2/admins "LinOTP2 admin area" admin
    2. 비밀번호를 설정 한 후 인스턴스를 재부팅
    1. https://[IPofInstance]/manage 접속
      • [IPofInstance] : EC2의 Public IP
      • admin/바로 위에 설정한 PW 로 로그인
    1. LinOTP Config 탭 → UserIdResolvers
    1. New 클릭 → LDAP를 선택합니다.
    1. 서버 구성 필드 정보 입력. 아래 샘플 참조
      • 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

     

    1. Test LDAP Server connection을 클릭 해 LDAP 서버 연결 테스트 → 성공하면 Save하여 Resolver 저장
    1. Realm 생성 → Resolver를 생성하면 Realms가 없어 자연스럽게 생성 창으로 유도한다.
    1. OK → New → 원하는 Realm name 입력 후 저장
    1. 사용자보기User View 탭을 선택하면 Active Directory의 사용자 목록 확인 가능
    1. 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
    1. Policies 탭 → Import Policies → samplepolicy.cfg를 등록
  • 3 단계 : 사용자 등록
    1. EC2 보안 그룹의 TCP 443, 80 및 UDP 1812 에대한 인바운드 규칙 허용
    1. https://[IPofInstance] 접속 후 Active Directory에 생성한 Username/Password로 로그인
      • [IPofInstance] : EC2의 Public IP
    1. Enroll TOTP Token 화면에서 'Generate Random Seed' 및 'Google Authenticator compliant' 체크 후 enroll TOTP token
    1. QR 코드가 나타나면 Google Authenticator로 스캔해서 추가
    1. https://[IPAddressofRADIUS]/validate/check?user=[USERNAME]&pass=[PINOTP] 로 접속하여 테스트
      • [IPAddressofRADIUS] : EC2의 Public IP
      • [USERNAME] : 테스트할 AD user 이름
      • [PINOTP] : Google OTP
      • 아래 응답을 받으면 인증에 성공한 것 ( "value" : true )
  • 4 단계 : FreeRADIUS를 설치하고 구성합니다. (EC2 Instance)
    1. 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
    1. 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'
      }
    1. FreeRADIUS 용 linotp perl 모듈 다운로드
      sudo git clone https://github.com/LinOTP/linotp-auth-freeradius-perl.git /usr/share/linotp/linotp-auth-freeradius-perl
    1. FreeRADIUS가 'linotp'플러그인을 실행하도록 허용 vi /etc/raddb/mods-available/perl
      # 10000dd 로 모든 내용을 지우고 아래 내용 붙여넣기 
      perl { 
      	filename = /usr/share/linotp/linotp-auth-freeradius-perl/radius_linotp.pm 
      }
    1. Perl 모듈 활성화 sudo ln -s /etc/raddb/mods-available/perl /etc/raddb/mods-enabled/perl
    1. 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
    1. 활성화 된 구성에 대한 기본 링크 제거
      sudo rm /etc/raddb/sites-enabled/{inner-tunnel,default}
      sudo rm /etc/raddb/mods-enabled/eap
    1. '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
              }
      }
    1. /etc/raddb/sites-enabled의 소프트 링크를 만들어 구성 활성화
      sudo ln -s /etc/raddb/sites-available/linotp /etc/raddb/sites-enabled/linotp
    1. Radius 서비스 활성화 및 시작
      sudo systemctl enable radiusd 
      sudo systemctl restart radiusd
  • 5 단계 : EC2 인스턴스에서 솔루션 테스트

    RADIUS EC2 서버에서 Google 인증 테스트 가능

    • radtest user01 937212 localhost:1812 10 secretcode
    • radtest USERNAME MFACODE PRIVATERADIUSIP:1812 10 SECRETWORD
      • USERNAME : 접속할 유저 네임
      • MFACODE : Google OTP
      • SECRETWORK : /etc/raddb/client.conf 내부의 secret값
    • Access-Accept 응답을 받아야 성공
  • 6 단계 : AWS 디렉터리에서 MFA 활성화
    1. 디렉터리 서비스 콘솔 →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
    1. MFA 설정에 성공하면 AWS Workspaces에 접속

'Cloud > 일반' 카테고리의 다른 글

AWS Session Manager (SSM) - Linux  (0) 2021.02.26
AWS Session Manager (SSM) - Windows Server  (0) 2021.02.26
[3Tier 구축] Web-WAS-DB 3tier in AWS  (2) 2021.01.27
AWS RDS (MS-SQL) 설치 및 사용 방법  (0) 2021.01.19
AWS Backup  (0) 2021.01.19
Comments