주식회사 누리아이티

정보자산의 보안강화를 위한 3단계 인증 보안SW(BaroPAM) 전문기업인 누리아이티

▶ BaroSolution/가이드

Rocky linux에서 SSSD 및 BaroPAM와 함께 FreeRADIUS를 사용하는 2단계 인증

누리아이티 2023. 9. 20. 15:23

1. RADIUS 인증

 

1.1 개요

  

RADIUS(Remote Authentication Dial In User Service, 원격 인증 전화 사용자 서비스 위치)는 네트워킹 프로토콜로 사용자가 네트워크에 연결하고 네트워크 서비스를 받기 위한 중앙 집중화된 인증, 인가, 회계 (AAA, 회계 Accounting은 인증, 인가 후 각종 사후 처리를 맡는다.) 관리를 제공한다. RADIUS 1991년 서버 접근 인증, 회계 프로토콜로써 Livingston Enterprises, Inc. 에서 개발했다. 그리고 후에 IETF표준으로 등재되었다.

 

지원 범위가 넓고 유비쿼터스 환경에서도 사용이 가능하기에 ISP와 기업들이 인터넷이나 인트라넷 접근을 관리하거나 무선 네트워크 인증, 통합 메일 서비스 등에 자주 쓰인다. 모뎀, 무선 액세스 포인트, 디지털 가입자 회선, 가상 사설망, TCP UDP 포트, 웹 서버 등에 사용된다.

 

RADIUS는 응용 계층에서 작동하는 클라이언트 및 서버 프로토콜이며 사용자 데이터그램 프로토콜을 통해서 전송된다. 원격 접속 서버, 가상 사설망, 네트워크 스위치의 포트 인증, 네트워크 엑세스 서버(NAS) 이들 모두는 RADIUS서버와 통신하는 컴포넌트를 가진다. RADIUS는 종종 IEEE 802.1X 인증의 기반이 되기도 한다.

 

RADIUS 서버는 리눅스/유닉스 시스템이나 윈도우 서버에서 자주 백그라운드 프로세스로 실행된다.

 

RADIUS 인증 과정인 프로세스 흐름은 비교적 간단하지만 이해하는 것이 중요하다.

 

1. 어플리케이션 클라이언트는 어플리케이션 서버에 연결을 시도하고 일회용 인증키와 함께 자격 증명(로그인-ID와 비밀번호)을 제공한다.

2. 어플리케이션 서버가 이 정보를 수신하고 로컬 카탈로그에서 사용자를 찾고 인증 유형이 PAM인지 확인한다.

3. 그런 다음 외부 사용자를 인증할 위치를 결정한다.

4. RADIUS 연결 정보를 사용하여 어플리케이션 서버는 자격 증명 세부 정보를 RADIUS 서버로 전달한다.

5. RADIUS 서버는 먼저 PAM, HTTP, SQL, Active Directory, LDAP 서비스 등이 될 수 있는 PAM를 사용하여 로그인-ID / 비밀번호 "기본 인증(Primary Authentication)"을 한다.

6. 유효성이 확인되면 RADIUS 서버는 2차 인증 서비스인 BaroPAM 모듈로 일회용 인증키 "2차 인증(Secondary Authentication)"을 한다.

7. 유효성이 확인된 경우 RADIUS 서버는 "Access-Accept" 응답을 어플리케이션 서버로 다시 전달한 다음 연결을 수락하고 완료한다.

 

일관되고 정확한 시간은 제안된 솔루션의 작동을 위한 핵심 요구 사항이다. RADIUS 호스트는 Active Directory와의 SSSD 통합을 활용하므로 둘 다 동일한 시간을 가져야 한다. 또한, 시간 기반 일회용 인증키(One-Time Authentication key)를 사용하는 경우 BaroPAM 서비스와 BaroPAM 앱이 설치된 기기는 일관된 시간을 가져야 한다.

 

 

1.2 구성 아키텍처

 

 

 

1.3 구성 요소

 

-Rocky linux 8

-FreeRADIUS

-System Security Services Daemon (SSSD)

-BaroPAM PAM Library, Service, & APP

-Pluggable Authentication Module (PAM)

 

IPA(FreeIPA)에 대해 SSSD를 사용할 예정이다. 여기서 IPA Red Hat Identity Manager(IdM)의 업스트림 프로젝트인 "ID, 정책 및 감사"이다.

 

 

1.4 방화벽 요구사항

 

1) User -> NAS

-TCP 443: SSL VPN

 

2) NAS -> RADIUS

-UDP 1812: RADIUS

 

3) RADIUS -> Active Directory

-UDP 53: DNS

-UDP 123: NTP

-TCP 88: Kerberos

-TCP 389: LDAPS

-TCP 3268: Global Catalog

 

 

1.5 설치 작업

 

-Rocky 8 설치

-FreeRADIUS 설치

-FreeRADIUS 로컬 Linux 계정 테스트

-SSSD 설치

-SSSD 계정을 사용하여 FreeRADIUS 테스트

-BaroPAM Authenticator 설치

-PAM 구성

-NTP 구성

-SELinux 구성

 

-SSSD BaroPAM을 사용하여 FreeRADIUS 테스트

-방화벽 구성

-SSLVPN RADIUS 구성

 

 

2. FreeRADIUS

 

2.1 FreeRADIUS 설치

 

$ yum -y install freeradius freeradius-utils

 

설치된 FreeRADIUS를 제거 할려고 할 때 -> yum -y erase freeradius freeradius-utils

 

 

2.2 FreeRADIUS 구성

 

FreeRADIUS를 사용하려면 사용자 홈 디렉터리의 BaroPAM 인증 모듈에 액세스하려면 "root" 계정으로 실행해야 한다.

 

1) radiusd.conf 설정

 

사용자 및 그룹 업데이트

 

$ vi /etc/raddb/radiusd.conf
#user = radiusd
#group = radius
user = root
group = root

 

FreeRADIUS를 사용하려면 사용자 홈 디렉터리의 BaroPAM 인증 모듈에 액세스하려면 "root" 계정으로 실행해야 한다.

 

보다 쉬운 문제 해결을 위해 log 지시문에서 /etc/raddb/radiusd.conf를 편집하여 추가 로깅을 활성화 한다.

 

auth = yes
auth_badpass = yes
auth_goodpass = yes

 

2) sites-enabled/default 설정

 

PAM을 활성화 하려면 /etc/raddb/sites-enabled/default를 편집 해야 한다. PAM이 활성화 되도록 #PAM 라인의 주석을 해제한다.

 

$ vi /etc/raddb/sites-enabled/default
#  Pluggable Authentication Modules.
#       pam
       pam

 

FreeRADIUS 로그인 "auth_log" "reply_log"을 활성화하기 위하여 주석(#) 처리를 제거 한다.

 

$ vi /etc/raddb/sites-enabled/default
 
#
        #  If you want to have a log of authentication requests,
        #  un-comment the following line, and the 'detail auth_log'
        #  section, above.
#       auth_log
        auth_log
 
        #
        #  If you want to have a log of authentication replies,
        #  un-comment the following line, and the 'detail reply_log'
        #  section, above.
#       reply_log
        reply_log

 

3) pam 모듈 활성화

 

다음과 같이 PAM을 활성화하기 위하여 /etc/raddb/mods-enabled/에서 PAM용 소프트 링크로 생성한다.

 

$ ln -s /etc/raddb/mods-available/pam /etc/raddb/mods-enabled/pam
$ ls -l /etc/raddb/mods-enabled/pam
lrwxrwxrwx. 1 root root 29 Oct 28 21:17 /etc/raddb/mods-enabled/pam -> /etc/raddb/mods-available/pam

 

4) clients.conf 설정

 

Radius 서버의 IP 주소(192.168.21.1)가 클라이언트 또는 VPN 솔루션인 ipaddr, ipv4addr secret를 다음과 같이 변경한다.

 

$ vi /etc/raddb/clients.conf
 
client 192.168.21.1 {
        ipaddr = 192.168.21.1
        secret = baropam
        require_message_authenticator = no
        nas_type = other
}

 

Radius 서버에서 설정한 IP 주소(192.168.21.1), 포트(1812), Secret(baropam)SSLVPN RADIUS settings 화면에 동일하게 설정해야 한다.

 

 

5) "users" 설정

 

DEFAULT 그룹 업데이트과 인증 유형을 PAM으로 다음과 같이 변경한다.

 

$ vi /etc/raddb/users
 
#DEFAULT        Group == "disabled", Auth-Type := Reject
#               Reply-Message = "Your account has been disabled."
#
DEFAULT Group == "disabled", Auth-Type := Reject
                Reply-Message = "Your account has been disabled."
 
DEFAULT Auth-Type := PAM

 

6) EAP에 대한 인증서 생성

 

FreeRADIUS 설치 후에는 반드시 EAP에 대한 인증서을 생성해야 한다.

 

$ cd  /etc/raddb/certs
$ ./bootstrap

 

EAP에 대한 인증서를 생성하지 않으면 다음과 같은 오류가 발생한다.

 

Failed reading private key file /etc/raddb/certs/server.pem
:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
rlm_eap_tls: Failed initializing SSL context
rlm_eap (EAP): Failed to initialise rlm_eap_tls
/etc/raddb/mods-enabled/eap[17]: Instantiation failed for module "eap"

 

 

2.3 Linux 계정으로 FreeRADIUS 테스트

 

디버그 모드에서 radiusd를 시작한다. 완료되면 "ctrl+c"를 사용하여 radiusd 세션을 종료한다.

 

$ radiusd –X
..
[ lines of configuration details]
}
Listening on auth address * port 1812 bound to server default
Listening on acct address * port 1813 bound to server default
Listening on auth address :: port 1812 bound to server default
Listening on acct address :: port 1813 bound to server default
Listening on auth address 127.0.0.1 port 18120 bound to server inner-tunnel
Listening on proxy address * port 45094
Listening on proxy address :: port 35184
Ready to process requests

 

SSH 세션을 열고 테스트 사용자를 생성한다.

 

$ useradd raduser
$ passwd raduser
Changing password for user raduser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

 

radiusd-util 패키지의 "radtest"와 로컬 Linux 계정인 "raduser"를 사용하여 테스트 한다.

 

$ radtest raduser Password1 localhost 0 baropam
Sent Access-Request Id 220 from 0.0.0.0:33872 to 127.0.0.1:1812 length 77
        User-Name = "raduser"
        User-Password = "Password1"
        NAS-IP-Address = 192.168.21.1
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "Password1"
Received Access-Accept Id 220 from 127.0.0.1:1812 to 0.0.0.0:0 length 20

 

마지막 줄에는 성공을 의미하는 "Received Access-Accept"가 있다.

 

 

3. System Security Services Daemon (SSSD)

 

System Security Services Daemon (SSSD)는 원래 Linux 운영 체제(OS)용으로 개발된 소프트웨어로, 원격 디렉터리 서비스 및 인증 메커니즘에 대한 액세스를 관리하는 데몬 세트를 제공한다.

 

3.1 SSSD 설치

 

$ yum install sssd realmd adcli

 

호스트 "2fcosrad7"을 도메인 "2factor.net"에 가입시킨다. -U를 사용하여 관리자 계정을 지정할 수도 있다. 기본 "Computers" OU와 비교하여 컴퓨터 개체를 생성하기 위한 OU 지정을 포함한 옵션을 검토하려면 "man realm"을 사용해야 한다.

 

# realm join 2factor.net
Password for Administrator:

 

적절한 권한이 있는 유효한 자격 증명을 제공하면 컴퓨터 개체와 DDNS 레코드가 생성된다.

 

Active Directory 보안 그룹을 사용하여 Active Directory 사용자 자격 증명을 사용하여 사용자가 액세스할 수 있는 대상을 제한하는 것이 좋다. "vpnurs"라는 그룹을 만들고 "richard@2factor.net"을 회원으로 추가한다.

 

기존 Active Directory 그룹(vpnuusers)을 지정한다.

 

$ realm permit -g vpnusers

 

 

3.2 SSSD 테스트

 

콘솔이나 SSH에 로그인 하려면 "vpnurs"의 그룹 구성원인 "richard"를 사용한다.

 

Rocky Linux 8 (Core)
Kernel 3.10.0-229.1.2.el7.x86_64 on an x86_64
 
2fcosrad7 login: richard@2factor.net
Password:
Creating home directory for richard@2factor.net.
[richard@2factor.net@2fcosrad7 ~]

 

 

3.3 SSSD 계정으로 FreeRADIUS 테스트

 

디버그 모드에서 radiusd를 시작한다. 완료되면 "ctrl+c"를 사용하여 radiusd 세션을 종료한다.

 

$ radiusd –X

 

다른 SSH를 열고 "radtest" 유틸리티를 사용하고 "vpnurs" 그룹의 구성원인 Active Directory 사용자를 사용한다.

 

$ radtest richard@2factor.net Password1 localhost 0 baropam
Sending Access-Request Id 251 from 0.0.0.0:53104 to 127.0.0.1:1812
        User-Name = 'richard@2factor.net'
        User-Password = 'Password1'
        NAS-IP-Address = 172.16.1.25
        NAS-Port = 0
        Message-Authenticator = 0x00
Received Access-Accept Id 251 from 127.0.0.1:1812 to 127.0.0.1:53104 length 20

 

마지막 줄에는 성공을 의미하는 "Received Access-Accept"가 있다.

 

 

4. BaroPAM Authenticator

 

설치하고 하는 Linux 시스템의 운영체제에 대한 이름 또는 시스템 정보, 커널 정보를 확인하기 위하여 root 계정으로 접속한 후 다음과 같은 명령어를 실행한다.

 

$  uname -a
Linux baropam 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

 

BaroPAM 인증 모듈을 다운로드 및 설치하기 위해서 root 계정으로 접속한 후 모듈을 다운로드 및 설치하기 위한 디렉토리(/usr/baropam)를 다음과 같이 생성한다.

 

$ mkdir /usr/baropam

 

BaroPAM 인증 모듈을 다운로드 및 설치하기 위한 디렉토리의 권한(읽기, 쓰기, 실행)을 다음과 같이 부여한다.

 

$ chmod -R 777 /usr/baropam

 

BaroPAM 인증 모듈은 root 계정으로 접속한 후 모듈을 다운로드 및 설치하기 위한 디렉토리(/usr/baropam)로 이동하여 모듈을 다운로드 하는 방법은 다음과 같다.

 

[root] /usr/baropam > wget http://nuriapp.com/download/libpam_baro_auth-x.x.tar

 

BaroPAM 인증 모듈의 다운로드가 완료되면 tar 파일의 압축을 해제하는 방법은 다음과 같다.

 

[root] /usr/baropam > tar -xvf libpam_baro_auth-x.x.tar

 

BaroPAM 인증 모듈의 압축을 해제하면 baropam 디렉토리에 다음과 같은 BaroPAM 관련 모듈이 생성된다.

 

[root] /usr/baropam > ls -al
합계 180
drwxrwxrwx  7 root   root   4096  8 23 09:59 .
drwxr-xr-x 17 root   root   4096  2 10  2017 ..
-r--r--r--  1 root   root      8  3 24  2021 .baro_acl
-r--r--r--  1 root   root    305  7  2 14:41 .baro_auth
-r--r--r--  1 root   root    290  6 30 12:55 .baro_curl
-rwxr-xr-x  1 root   root  69149  4  6 19:12 baro_auth
-rwxr-xr-x  1 root   root  65072  6 29 16:36 baro_curl
drwxr-xr-x  2 root   root   4096  7 20  2021 jilee
-rwxr-xr-x  1 root   root 152649  6  9 08:19 pam_baro_auth.so
-rwxr-xr-x  1 root   root 116158  6 30 12:54 pam_baro_curl.so
-rw-r--r--  1 root   root    221  6 27 15:59 setauth.sh
-rw-r--r--  1 root   root    150  6 29 16:29 setcurl.sh

 

생성한 BaroPAM 인증 모듈이 시스템에 맞는 모듈인지 다음과 같은 명령어를 실행하여 확인한다.

 

[root] /usr/baropam > file pam_baro_auth.so
pam_baro_auth.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=d2d7b4ffe8b1a25f6a11685cb7ad4ec9787163b5, not stripped
 
[root] /usr/baropam > ldd pam_baro_auth.so
        linux-vdso.so.1 =>  (0x00007ffe7f503000)
        libpam.so.0 => /usr/lib64/libpam.so.0 (0x00007f23a3318000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f23a30a6000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f23a2c45000)
        libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f23a2a41000)
        libz.so.1 => /usr/lib64/libz.so.1 (0x00007f23a282b000)
        libc.so.6 => /usr/lib64/libc.so.6 (0x00007f23a245e000)
        libaudit.so.1 => /usr/lib64/libaudit.so.1 (0x00007f23a2235000)
        libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00007f23a1fe8000)
        libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00007f23a1d00000)
        libcom_err.so.2 => /usr/lib64/libcom_err.so.2 (0x00007f23a1afc000)
        libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00007f23a18c9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f23a372f000)
        libcap-ng.so.0 => /usr/lib64/libcap-ng.so.0 (0x00007f23a16c3000)
        libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00007f23a14b5000)
        libkeyutils.so.1 => /usr/lib64/libkeyutils.so.1 (0x00007f23a12b1000)
        libresolv.so.2 => /usr/lib64/libresolv.so.2 (0x00007f23a1098000)
        libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f23a0e7c000)
        libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007f23a0c55000)
        libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f23a09f3000)

 

BaroPAM 환경 설정 파일은 baro_auth 프로그램을 실행하여 반드시 생성하는데, BaroPAM 인증 모듈의 디렉토리인 /usr/baropam 밑에 위치 하도록 한다.

 

형식)

baro_auth -r rate_limit -R rate_time -t cycle_time k key_method e encrypt_flag -H hostname -A acl_type -a acl_filename -S secure_key -s filename

 

BaroPAM 환경설정 파일의 설정 옵션에 대한 내용은 다음과 같다.

 

옵션 설명 설정값 비고
-r 일회용 인증키의 제한횟수(1~10) 3  
-R 일회용 인증키의 제한시간(, 15~600) 30  
-t 일회용 인증키의 인증주기(, 3~60) 30  
-k 일회용 인증키의 인증방식(app1, app256, app384, app512). app512  
-e 환경설정 파일의 암호화 여부(yes or no) no  
-H 서버의 호스트명(uname n) nurit.co.kr  
-A 2차 인증에서 허용(allow) 또는 제외(deny)할지 선택 deny  
-a 2차 인증에서 허용(allow) 또는 제외(deny)할 계정에 대한 ACL 파일명(파일 접근권한은 444) /usr/baropam/.baro_acl  
-S 반드시 벤더에서 제공하는 Secure key(라이선스 키) jIqIcHbVqdpj7b4PzBpM2DiIeBvmHFV/  
-s BaroPAM 환경설정 파일을 생성할 디렉토리를 포함한 파일명 /usr/baropam/.baro_auth  

 

주의) s 옵션의 filenameBaroPAM 환경설정 파일을 생성할 디렉토리를 포함한 파일명(파일 접근권한은 444)이며, 설정한 서버의 호스트명(hostname)이 맞지 않는 경우 BaroPAM 이 정상적으로 작동되지 않을 수 있으니, 호스트명(hostname)가 변경되는 경우 반드시 환경 설정의 해당 항목에 반영해야 한다.

 

사용 예)

[root] /usr/baropam > ./baro_auth -r 3 -R 30 -t 30 k app512 e no -H nurit.co.kr -A deny -a /usr/baropam/.baro_acl -S jIqIcHbVqdpj7b4PzBpM2DiIeBvmHFV/ -s /usr/baropam/.baro_auth

 

만약, 계정마다 BaroPAM 환경 설정파일을 각각 설정하는 경우 해당 계정으로 접속하여 작업을 진행한다. (Not root)

 

[root] /usr/baropam > ./baro_auth -r 3 -R 30 -t 30 k app512 e no -H nurit.co.kr -A deny -a ~/.baro_acl -S jIqIcHbVqdpj7b4PzBpM2DiIeBvmHFV/ -s ~/.baro_auth

 

1) Your emergency one-time authentication keys are :

 응급 일회용 인증키일회용 인증키 생성기인 BaroPAM 앱을 사용할 수 없을 때 분실한 경우를 대비하여 SSH 서버에 다시 액세스하는데 사용할 수 있는 접속이 가능한 Super 인증키 이므로 어딘가에 적어 두는 것이 좋다.

 

2) 다음에 나오는 물음에 대해서는 모두 "y"를 입력한다.

     "/usr/baropam/.baro_auth" 파일을 업데이트하시겠습니까 (y/n) y

     중간자(man-in-the-middle) 공격을 예방할 것인가 (y/n) y

 

BaroPAM 환경 설정 파일인 .baro_auth에 설정한 내용은 다음과 같다.

 

[root] /usr/baropam > cat .baro_auth
" AUTH_KEY
" RATE_LIMIT 3 30
" KEY_METHOD app512
" CYCLE_TIME 30
" SECURE_KEY jIqIcHbVqdpj7b4PzBpM2DiIeBvmHFV/
" ACL_NAME /usr/baropam/.baro_acl
" ACL_TYPE deny
" HOSTNAME nurit.co.kr
" DISALLOW_REUSE
33458936
19035576
15364353
54649370
84342192

 

BaroPAM 환경설정 파일인 .baro_auth의 설정 항목에 대한 내용은 다음과 같다.

 

항목 설명 설정값 비고
AUTH_KEY 인증 구분자(고정)    
RATE_LIMIT 일회용 인증키의 제한횟수(1~10), 제한시간(, 15~600) 3 30  
KEY_METHOD 일회용 인증키의 인증방식(app1, app256, app384, app512) app512  
CYCLE_TIME 일회용 인증키의 인증주기(, 3~60) 30  
SECURE_KEY 반드시 벤더에서 제공하는 Secure key(라이선스 키) jIqIcHbVqdpj7b4PzBpM2DiIeBvmHFV/  
HOSTNAME 서버의 호스트명(uname n) nurit.co.kr  
ACL_TYPE 2차 인증에서 허용(allow) 또는 제외(deny) 구분 deny  
ACL_NAME 2차 인증에서 허용 또는 제외할 계정에 대한 ACL Filename(파일 접근권한은 444) /usr/baropam/.baro_acl  
DISALLOW_REUSE
or
ALLOW_REUSE
중간자(man-in-the-middle) 공격을 예방할 경우는 "DISALLOW_REUSE"을 설정한 경우 일회용 인증키의 인증주기 동안은 다른 사용자가 로그인 할 수 없으며, 만약 허용할 경우는 "ALLOW_REUSE"을 설정한다. DISALLOW_REUSE  

 

 

5. PAM 구성

 

SSSD BaroPAM Authenticator를 모두 활용하려면 "/etc/pam.d/radiusd" 파일을 구성해야 한다.

 

$ vi /etc/pam.d/radiusd
#%PAM-1.0
auth       requisite    /usr/baropam/pam_baro_auth.so forward_pass secret=/usr/baropam/.baro_auth encrypt=no
 
auth       required     pam_sss.so use_first_pass
account    required     pam_nologin.so
account    include      password-auth
session    include      password-auth

 

계정마다 BaroPAM 환경 설정파일을 각각 설정하지 않고 특정 디렉토리에 계정별로 BaroPAM 환경 설정파일을 다르게 설정하고자 하는 경우 BaroPAM 모듈을 설정하기 위해서 radiusd 파일에 설정하는 방법은 다음과 같이 최 상단에 입력해 준다.

 

[root] /usr/baropam > vi /etc/pam.d/radiusd
#%PAM-1.0
auth       requisite    /usr/baropam/pam_baro_auth.so forward_pass secret=/usr/baropam/radius/.${USER}_auth encrypt=no

 

사용자의 로그인 정보(로그인-ID, 폰번호) 관련 쉘 스크립트를 실행하기 위하여 BaroPAM 등록 디렉토리(/usr/baropam/radius)로 이동하여 실행한다.

 

참고) 쉘 스크립트 실행 시 인수나 인수값의 구분은 공백(space)으로 해야 한다.

 

예) 사용자의 로그인-ID를 생성하는 쉘 스크립트 - setvpnuser.sh

 

#!/bin/sh
 
export LANG=C
ENV_HOME=/usr/baropam/radius;
ACC_HOME=/home/$1
 
userdel –rf $1
\rm ${ENV_HOME}/.$1_auth
 
useradd –d ${ACC_HOME} -m -s /bin/bash $1
echo $2 | passwd -stdin $1
 
\cp ${ENV_HOME}/.baro_auth ${ENV_HOME}/.$1_auth
 
sed -i "s/01012341234/$3/g" ${ENV_HOME}/.$1_auth

 

사용자의 로그인-ID를 생성하는 쉘 스크립트(setvpnuser.sh) 실행 시 파라미터는 다음과 같다.

$1 : 생성할 로그인-ID

$2 : 로그인-ID의 비밀번호

$3 : 로그인-ID의 폰번호

 

[root@localhost ~]# sh setvpnuser.sh nurit baropam 01027714076

 

) 사용자의 로그인-ID의 비밀번호를 변경하는 쉘 스크립트 - setvpnpasswd.sh

 

#!/bin/sh
 
export LANG=C
 
echo $2 | passwd -stdin $1

 

사용자의 로그인-ID의 비밀번호를 변경하는 쉘 스크립트(setvpnpasswd.sh) 실행 시 파라미터는 다음과 같다.

$1 : 로그인-ID

$2 : 변경할 비밀번호

 

[root@localhost ~]# sh setvpnpasswd.sh nurit !@Baropam#

 

) 사용자의 로그인-ID의 폰번호를 변경하는 쉘 스크립트 - setvpnphone.sh

 

#!/bin/sh
 
export LANG=C
ENV_HOME=/usr/baropam/radius;
 
sed -i "s/$2/$3/g" ${ENV_HOME}/.$1_auth

 

사용자의 로그인-ID의 폰번호를 변경하는 쉘 스크립트(setvpnphone.sh) 실행 시 파라미터는 다음과 같다.

$1 : 로그인-ID

$2 : 변경전 폰번호

$3 : 변경후 폰번호

 

[root@localhost ~]# sh setvpnphone.sh nurit 01012341234 01027714076

 

) 사용자의 로그인-ID의 비밀번호와 폰번호를 변경하는 쉘 스크립트 - chgvpnpasswd.sh

 

#!/bin/sh
 
export LANG=C
 
echo $2 | passwd -stdin $1
 
sed -i "s/$3/$4/g" ${ENV_HOME}/.$1_auth

 

사용자의 로그인-ID의 비밀번호와 폰번호를 변경하는 쉘 스크립트(setvpnpasswd.sh) 실행 시 파라미터는 다음과 같다.

$1 : 로그인-ID

$2 : 변경할 비밀번호

$3 : 변경전 폰번호

$4 : 변경후 폰번호

 

[root@localhost ~]# sh chgvpnpasswd.sh nurit !@Baropam# 01012341234 01027714076

 

) 사용자의 로그인-ID를 삭제하는 쉘 스크립트 - delvpnuser.sh

 

#!/bin/sh
 
export LANG=C
ENV_HOME=/usr/baropam/radius;
ACC_HOME=/home/$1
 
userdel –rf $1
\rm ${ENV_HOME}/.$1_auth

 

사용자의 로그인-ID를 삭제하는 쉘 스크립트(delvpnuser.sh) 실행 시 파라미터는 다음과 같다.

$1 : 삭제할 로그인-ID

 

[root@localhost ~]# sh delvpnuser.sh nurit

 

 

6. NTP(Network Time Protocol) 구성

 

BaroPAM은 시간 동기화 방식이므로 서버의 시간이 현재 시간과 다를 경우 일회용 인증키가 서로 일치하지 않아서 서버에 로그인을 못하는 경우가 발생할 수 있다.

 

최근에는 정보자산에 대한 시간 동기화(타임서버 시간 동기화)하는 방법으로 NTP(Network Time Protocol)을 이용하여 루트 계정에서 시스템의 시각을 현재 시각으로 설정할 수 있다.

 

NTP를 사용하기 위해서는 기본적으로 NTP 패키지가 반드시 설치되어 있어야 한다. 설치 확인은 다음의 명령어를 실행하여 확인한다. 만약, 설치되어 있지 않으면 Redhat, CentOS 8 이상 버젼은 "yum install chrony" 명령어로 설치하면 된다.

 

[root@baropam ~]# rpm -qa | grep chrony
chrony-3.5-1.el8.x86_64

 

우리나라에서 운영되고 있는 NTP 서버는 다음과 같다.

 

server kr.pool.ntp.org
server time.bora.net
server time.kornet.net

 

우리나라에서 운영되고 있는 NTP 서버를 ntpd 데몬 설정을 위한 설정 파일인 "/etc/chrony.conf"에 다음과 같이 설정한다.

 

[root@baropam ~]# vi /etc/chrony.conf
 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#pool 2.centos.pool.ntp.org iburst
server kr.pool.ntp.org iburst
server time.bora.net   iburst
 
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
 
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
 
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
 
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *
 
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
 
# Allow NTP client access from local network.
allow 192.168.0.0/16
 
# Serve time even if not synchronized to a time source.
#local stratum 10
 
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
 
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
 
# Specify directory for log files.
logdir /var/log/chrony
 
# Select which information is logged.
#log measurements statistics tracking

 

ntpd 데몬 설정을 위한 설정이 끝나면 반드시 NTP 설정이 제대로 추가되었는지 확인한 후 NTP 데몬의 Restart 작업이 반드시 필요하다. (chrony 서비스 시작 및 부팅시 구동 등록)

 

[root@baropam ~]# sudo systemctl enable chronyd
[root@baropam ~]# sudo systemctl restart chronyd

 

ntpd 시간 확인은 다음과 같은 명령어로 확인할 수 있다.

 

시간을 받아오는 서버 리스트 / chrony.conf 파일에 등록한 server 리스트)

 

[root@baropam ~]# chronyc sources
210 Number of sources = 2
MS Name/IP address         Stratum Poll Reach LastRx Last sample              
===============================================================================
^* ec2-54-180-134-81.ap-nor>     2   6   377    43   -349us[-1059us] +/-   24ms
^- time.bora.net                 2   6   377    42  +1398us[+1398us] +/-   90ms

 

시간을 받아오는 서버 정보)

[root@baropam ~]# chronyc tracking
Reference ID    : 36B48651 (ec2-54-180-134-81.ap-northeast-2.compute.amazonaw)
Stratum         : 3
Ref time (UTC)  : Sun Mar 22 07:07:43 2020
System time     : 0.000130027 seconds slow of NTP time
Last offset     : -0.000710122 seconds
RMS offset      : 0.000583203 seconds
Frequency       : 19.980 ppm fast
Residual freq   : +0.142 ppm
Skew            : 3.235 ppm
Root delay      : 0.013462566 seconds
Root dispersion : 0.017946836 seconds
Update interval : 65.0 seconds
Leap status     : Normal

 

시간 상태 및 동기화 등 정보 확인)

[root@baropam ~]# timedatectl status
               Local time: Sun 2020-03-22 16:08:45 KST
           Universal time: Sun 2020-03-22 07:08:45 UTC
                 RTC time: Sun 2020-03-22 07:08:44
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

 

 

7. SELinux 구성

 

Redhat 계열인 경우 "Selinux""Security Enhanced Linux"의 약자로 기본의 리눅스보다 더욱 뛰어난 보안정책을 제공하는데, 너무 뛰어난 나머지 활성화 되어 있을 경우 보안문제로 막혀서 BaroPAM이 안되는 부분이 발생(Failed to open tmp secret file "/usr/baropam/.baro_auth~" [Permission denied])한다.

 

기본적으로 SELinux "enforcing"으로 설정되어 FreeRadius 서비스에 대한 액세스(반경), 사용자 디렉터리 액세스를 방지한다. 그러나 radiusdBaroPAM Authenticator(pam_baro_auth)에 액세스해야 하므로 "enforcing"에서 "disabled"으로 변경해야 한다.

 

"getenforce""sestatus"를 사용하여 현재 SELinux 모드 보기

 

$ getenforce
Enforcing
 
$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28
 
$ setenforce disabled
 
$ getenforce
Disabled

 

"/etc/sysconfig/selinux"의 설정을 변경하여 SELinux의 모드를 "disabled" 변경으로 설정하면 시스템 재부팅 시에도 지속된다.

 

$ vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX= disabled
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted
 
# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

 

바로 적용은 되지 않으며 재부팅을 해야 적용이 된다.

 

재부팅을 하지 않고 현재 접속된 터미널에 한해 변경된 내용을 적용하고 싶을 경우 다음의 명령어를 실행하면 된다.

 

$ /usr/sbin/setenforce 0

 

 

8. SSSD BaroPAM Authenticator FreeRADIUS 테스트

 

"radtest" 유틸리티를 사용하여 "vpnurs"의 구성원인 사용자 "richard@2factor.net"을 입력하고, 비밀번호가 "Password1"이고 BaroPAM Authenticator의 응급 일회용 인증키가 "33458936"이면 비밀번호 뒤에 일회용 인증키를 "Password133458936" 형태로 덧붙여 입력해야 한다.

 

$ radtest richard@2factor.net Password133458936 localhost 0 baropam
Sending Access-Request Id 134 from 0.0.0.0:38338 to 127.0.0.1:1812
        User-Name = 'richard@2factor.net'
        User-Password = 'Password133458936'
        NAS-IP-Address = 172.16.1.25
        NAS-Port = 0
        Message-Authenticator = 0x00
Received Access-Accept Id 134 from 127.0.0.1:1812 to 127.0.0.1:38338 length 20

 

 

9. 방화벽 구성

 

firewalld를 사용하는 경우 방화벽을 비활성화하거나 중지하지 않았다면 다음 두 명령을 실행한다.

 

$ systemctl enable firewalld
$ systemctl start  firewalld

 

RADIUS 패킷을 허용하도록 Firewalld를 구성해야 한다.

 

RADIUS는 인증에 포트 1812를 사용하고 계정에 포트 1813을 사용하므로 이러한 포트에서 트래픽을 허용해야 한다. FreeRADIUS를 설치하면 방화벽에 구성이 추가되므로 RADIUS 트래픽을 허용하고 다음 명령을 실행한다.

 

$ firewall-cmd --permanent --zone=public --add-port=1812/udp
success
$ firewall-cmd --permanent --zone=public --add-port=1813/udp
success

 

또는

 

$ firewall-cmd --add-service=radius --permanent
success

 

변경 사항을 적용하려면 방화벽을 다시 로드하기 위하여 해야 다음 명령을 실행한다.

 

 $ firewall-cmd --reload
success

 

참고) 방화벽 firewall-cmd 설치 실행

$ firewall-cmd
usage: see firewall-cmd man page
No option specified.
 
$ firewall-cmd --zone=public --permanent --add-port=21/tcp
FirewallD is not running
 
 
1. 작동여부 확인
 
1-1. 방법
$ systemctl status firewalld
* firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
 
1-2. 방법
$ firewall-cmd --state
not running
 
 
2. firewalld 설치확인
$ yum list installed firewalld
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.daumkakao.com
 * epel: ftp.riken.jp
 * extras: ftp.daumkakao.com
 * updates: ftp.daumkakao.com
 * webtatic: sp.repo.webtatic.com
Installed Packages
firewalld.noarch                       0.4.4.4-6.el7                       @base
 
 
3. 패키지 삭제
$ yum remove firewalld.noarch
 
 
4. firewall 설치
$ yum install firewalld
 
 
5. firewall 실행
[root@localhost my.cnf.d]# systemctl start firewalld
 
 
6. firewall 상태 확인
[root@localhost my.cnf.d]# systemctl status firewalld
* firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-01-30 17:12:19 KST; 4s ago
     Docs: man:firewalld(1)
 Main PID: 21620 (firewalld)
   CGroup: /system.slice/firewalld.service
           `-21620 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

 

iptables-services를 사용하는 경우 UDP:1812(인증)를 포함하도록 기존 방화벽 스크립트를 생성하거나 업데이트 해야 한다. RADIUS UDP 또는 TCP 프로토콜을 사용할 수 있지만 UDP가 원래 프로토콜이므로 대부분의 NAS가 이를 사용한다. 포트 1813 RADIUS에서 계정 관리에 사용된다.

 

#!/bin/bash
# FreeRADIUS IPv4 Polcies
 
#Flush current policies
iptables -F
 
# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
 
# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 
# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
 
#ICMP Echo (OPTIONAL)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
 
# Accept incoming SSH
iptables -I INPUT -p tcp -m conntrack --ctstate NEW --dport 22 -j ACCEPT
 
# FreeRADIUS: Authentication = 1812 / Accounting = 1813
# Your NAS will generally dictate port and protocol
iptables -I INPUT -p udp -m conntrack --ctstate NEW --dport 1812 -j ACCEPT
#iptables -I INPUT -p udp -m conntrack --ctstate NEW --dport 1813 -j ACCEPT
 
# Save Changes
service iptables save
 
# Service
systemctl restart iptables
systemctl status iptables

 

radiusd 서비스를 활성화하고 시작해야 한다. 테스트를 위해 ctrl+c를 사용하여 이전 radiusd 인스턴스를 종료해야 한다.

 

$ systemctl enable radiusd
$ systemctl start  radiusd

 

NAS, SSL VPN을 통해 로그인하고 로그가 생성되었는지 확인한다.

 

$ ls /var/log/radius/radacct/
172.16.1.23
 
$ ls /var/log/radius/radacct/172.16.1.23/
auth-detail-20150520  reply-detail-20150520
 
$ cat /var/log/radius/radacct/172.16.1.23/auth-detail-20150520
Wed May 20 17:01:13 2015
        Packet-Type = Access-Request
        NAS-Identifier = '172.16.1.23'
        User-Name = 'richard@2factor.net'
        Tunnel-Client-Endpoint:0 = '172.16.1.1'
        NAS-IP-Address = 172.16.1.23
        NAS-Port = 0
        Acct-Session-Id = 'richard@2factor.net(2frad user realm)\"Wed May 20 17:01:13 2015\"/l0aCMuI'
        Event-Timestamp = 'May 20 2015 17:01:13 PDT'

 

 

10. FreeRADIUS 데몬 실행

 

FreeRADIUS 데몬인 radiusd를 다음과 같이 백그라운드로 실행한다.

 

$ radiusd -s &
[1] 1961

 

FreeRADIUS 데몬인 radiusd가 정상적으로 기동되었는지 다음과 같이 확인한다.

 

$ ps -ef|grep radiusd
root        1961    1818  0 14:11 pts/1    00:00:00 radiusd -s
root        1964    1818  0 14:11 pts/1    00:00:00 grep --color=auto radiusd

 

FreeRADIUS 데몬인 radiusd가 사용하는 UDP 포트인 1812를 다음과 같이 확인한다.

 

$ netstat -an | grep 1812
udp        0      0 127.0.0.1:18120         0.0.0.0:*                         
udp        0      0 0.0.0.0:1812            0.0.0.0:*                         
udp6       0      0 :::1812                 :::*

 

FreeRADIUS를 연동하여 BaroPAM에서 인증한 로그는 다음과 같이 확인한다.

 

$ tail –f /var/log/secure
Mar 26 13:54:11 localhost radiusd(pam_baro_auth)[1857]: Try to update RATE_LIMIT line.[3 30 1616734451]
Mar 26 13:56:46 localhost radiusd(pam_baro_auth)[1857]: Try to update RATE_LIMIT line.[3 30 1616734606]
Mar 26 14:00:48 localhost radiusd(pam_baro_auth)[1934]: Try to update RATE_LIMIT line.[3 30 1616734848]
Mar 26 14:00:48 localhost radiusd(pam_baro_auth)[1934]: Invalid verification code
Mar 26 14:00:48 localhost radiusd[1934]: pam_unix(radiusd:auth): authentication failure; logname=root uid=0 euid=0 tty= ruser= rhost=  user=scjoo1
Mar 26 14:01:13 localhost radiusd(pam_baro_auth)[1934]: Try to update RATE_LIMIT line.[3 30 1616734873]
Mar 26 14:01:36 localhost radiusd(pam_baro_auth)[1934]: Try to update RATE_LIMIT line.[3 30 1616734873 1616734896]
Mar 26 14:02:15 localhost radiusd(pam_baro_auth)[1934]: Try to update RATE_LIMIT line.[3 30 1616734935]

 

 

11. FreeRADIUS 데몬 종료

 

먼저 FreeRADIUS 데몬인 radiusd가 실행되었는지 다음과 같이 확인한다.

 

$ ps -ef|grep radiusd
root        1961    1818  0 14:11 pts/1    00:00:00 radiusd -s
root        1964    1818  0 14:11 pts/1    00:00:00 grep --color=auto radiusd

 

FreeRADIUS 데몬인 radiusd의 프로세스 ID(1961)를 확인 한 후 다음과 같이 종료한다.

 

$ kill -9 1961

 

참고) FreeRADIUS 관련 로그 파일: /var/log/radius/radius.log

 

 

12. SSLVPN RADIUS 구성

  

RADIUS(Remote Authentication Dial-In User Service)는 네트워크에서 로컬 및 원격 사용자를 인증한다. RADIUS는 사용자, 원격 액세스 서버, VPN 게이트웨이 및 기타 리소스에 대한 인증 정보를 하나의 중앙 데이터베이스에 저장하는 클라이언트/서버 시스템이다. Cisco Secure Access Control Server(ACS) 또는 FreeRADIUS RADIUS 서버로 사용할 수 있다.

 

NOTE) 시작하기 전에 RADIUS 서버가 구성되어 있고 제대로 작동하는지 확인해야 한다.

 

  

Step 1. SSL VPN 그룹 정책 SSLVPNPOLICY1을 구성하고, 이것과 동일한 정책을 공유하는 새 그룹 RADIUSGroup을 추가한다.

 

Step 2. 사용자 인증 방법을 지정한다.

a.  Users > Users Authentication 선택.

b.  드롭다운 메뉴에서 RADIUS를 선택하고 Configure을 클릭.

 

 

a.  RADIUS 구성 설정을 지정한다.

.RADIUS Server Timeout: 재인증이 필요하기 전에 연결이 활성화되는 시간()을 입력한다. 이 값은 네트워크 연결에 따라 다르다. (기본값은 3)

.Retries. 보안 어플라이언스가 인증 메시지 재전송을 시도하는 횟수를 입력한다.

.RADIUS Servers: RADIUS 사용자 그룹 수를 선택합니다. 최대 3개의 그룹(Group 1, Group 2, and Group 3)을 가질 수 있다.

.Primary Server: RADIUS 서버 IP 주소, 포트 번호, 공유 비밀 정보(secret)를 입력한다.

.Secondary Server: 해당하는 경우 보조 RADIUS 서버의 IP 주소, 포트 번호 및 공유 비밀 정보(secret)를 입력한다.

d. OK를 클릭하여 설정을 저장한다.

 

Step 3. RADIUS Users 탭을 클릭하고 사용자 정보를 지정한다.

 

 

.Allow Only Users Listed Locally: RADIUS users(로컬 데이터베이스에도 존재함)만 로그인 하도록 허용하려면 On을 클릭합니다.

.Mechanism for Setting User Group Memberships for RADIUS Users: 다음 중 하나를 선택한다.

- Use RADIUS Filter-ID: RADIUS 서버의 Framed-Filter-ID 속성을 이용하여 사용자 그룹 정보를 찾는다.

- Local Configuration Only: 로컬 데이터베이스에서만 사용자 그룹 정보를 찾는다. RADIUS 서버가 필터 ID를 반환하지 않으면 이 옵션을 선택해야 한다. 또한 로컬 데이터베이스의 그룹에 사용자를 추가해야 한다 (See Users > Users Authentication).

.Default User Group to Which All RADIUS Users Belong: RADIUS 서버가 그룹 이름을 반환하지 않거나 그룹이 존재하지 않는 경우 구성된 이 그룹에 사용자를 추가할 수 있다. 보안을 위해 None을 선택할 수도 있다.

 

Step 4. Test 탭을 클릭하고 Username Password 필드에 사용자의 자격 증명을 입력한다. 그런 다음 Test 버튼을 클릭하여 RADIUS 사용자가 유효한지 확인한다.

 

 

Step 5. OK를 클릭하여 설정을 저장한다.

이제 Cisco AnyConnect를 사용하여 SSL VPN 터널을 설정할 수 있다.