PAM(Pluggable Authentication Module, 정착형 인증 모듈)

 

1. PAM이란?

 

PAM Linux/Unix 시스템에서 중앙집중적인 인증 매커니즘을 지원하는 것이다. 게다가 시스템의 기본적인 인증 기법을 제공하여 이것을 사용하면 응용 프로그램 개발자 뿐만 아니라 시스템 관리자들이 인증을 유연성 있게 관리할 수 있도록 도와 준다.

 

전통적으로 시스템 자원에 대한 접근을 관리하는 프로그램들은 내장된 메커니즘에 의해 사용자 인증 과정을 수행한다. 이러한 방식은 오랫동안 이루어졌지만 이러한 접근 방식은 확장성이 부족하고 매우 복잡하다. 그렇기 때문인지 이러한 인증 매커니즘을 끌어내기 위한 수많은 해킹 시도가 있었다.

 

Solaris의 방식을 따라서 Unix/Linux 사용자들은 그들만의 PAM을 구현하는 방식을 찾았다.

 

PAM의 기본 원리는 응용 프로그램이 password 파일을 읽어 오는 대신 PAM이 직접 인증을 수행 하도록 하는 것이다. PAM은 시스템 관리자가 원하는 인증 매커니즘이 무엇이든 상관하지 않는다.

 

여러 사이트에서 선택 받은 인증 매커니즘은 아직도 password 파일이다. 왜 그럴까? 우리가 원하는 것을 해주기 때문이다. 대부분의 사용자는 password 파일이 필요한 것이 무엇인지 이미 알고 있다. 그리고 원하는 작업을 수행하는데 있어 이미 그 기능이 검증되었기 때문일 것이다.

 

PAM의 인증 절차는 다음과 같다.

 

 

2. PAM 동작 원리

 

PAM Windows 환경의 DDL(Dynamic Link Library)과 같은 것이다. Library로 프로그램이 어떤 사용자에 대한 인증을 수행하려면 PAM Library이 있는 함수를 호출한다. PAM은 해당 함수의 Library를 제공하여 응용 프로그램이 특정 사용자를 인증하도록 요청할 수 있다.

 

PAM을 통해 /etc/passwd 파일이나 /etc/shadow 파일을 확인하거나 또는 보다 복잡한 확인 작업을 수행하기도 하는데, 예로는 LDAP 서버에 접속하는 것이다.

 

확인 작업을 마치고, 인증 여부를 결정하게 되면 "인증됨/인증되지 않음"의 메시지를 자신을 호출한 응용 프로그램에 전송한다.

 

간단한 확인 작업이라고 했는데, 그 과정이 많아 보일 수가 있다. 여기에 나오는 각 모듈은 크기가 작고 작업 수행 시간이 매우 빠르다. 이것은 매우 놀랍기도 하지만 PAM을 단연코 사용하게 된다.

 

3. PAM 파일과 위치

 

파일 위치

설명

비고

/lib64/security

/lib/security

PAM 모듈 디렉토리로 실제 PAM Library를 동적으로 인증 모듈을 호출하여 실행한다.

 

/etc/security

/lib64/security에 있는 모듈에 대한 설정 파일.

 

/etc/pam.d

어플리케이션별 PAM의 설정 파일 위치로 PAM을 사용하는 응용 프로그램이 설정 파일이 없다면 기본값으로 설정된 설정 파일을 자동으로 사용한다.

 

 

4. PAM 라이브러리

 

라이브러리

설명

비고

pam_permit

pam_deny

항상 성공/실패를 리턴해서 접근을 허용, 거부.

 

pam_warn

호출한 사용자 및 호스트 정보를 syslog에 기록.

 

pam_access

사용자 계정, 호스트/도메인을 통해서 시스템 접근을 허용.

/etc/security/access.conf에서 설정한다.

 

pam_unix

pam_pwdb

암호를 확인하고 변경되는데 사용되는 모듈.

/etc/passwd shadow 사용시 /etc/shadow 파일에서 계정의 정보를 얻어온다.

 

pam_env

환경 변수를 지정.

/etc/security/pam_env.conf

설정 파일에서 환경 변수를 불러온다.

/etc/environment /etc/security/pam_env.conf 설정 파일이 비었을 경우 변수 설정 없이 성공 값을 반환한다.

 

pam_issue

pam_motd

로그인 시 issue message를 출력하며, 성공적으로 로그인한 후 나타난다. /etc/issue, /etc/motd

 

pam_limits

사용자의 프로세스 자원을 설정 파일에 따라 제한한다.

/etc/security/limits.conf

 

pam_listfile

파일에 있는 사용자명 목록에 따라 접근을 허용/거부.

 

pam_mkhomedir

사용자 홈 디렉토리가 없다면 홈 디렉토리를 생성하고, /etc/skel 디렉토리에 있는 파일들을 복사.

 

pam_nologin

/etc/nologin 파일이 존재하면 root만 로그인 가능하고, 일반 사용자 로그인 불가능하며, root로 로그인 시 nologin 파일의 내용이 보여진다.

 

pam_rhosts_auth

Rhost 방식으로 네트워크간 원격 세션을 허용.

 

pam_rootok

암호 없이 root의 접근을 허용.

 

pam_security

현재 터미널이 /etc/security 파일에 나열돼 있지 않으면 root 접근 거부.

 

pam_time

시간, 사용자, 그룹, 터미널, 쉘 등으로 접근을 제어한다.

/etc/security/time.conf

 

pam_wheel

Su 서비스에서 사용, 특정 그룹에 속하지 않은 사용자는 root로의 접근을 거부, deny 옵션을 사용하여 특정 그룹만 접근을 거부할 수 있게 설정 가능하다.

 

pam_cracklib

입력 받은 암호를 /usr/lib/cracklib_dict에 있는 사전과 비교하여 새로운 암호를 /etc/security/opasswd에 저장되어 있는 이전 암호 목록과 비교하여 이전 암호와 비숫한지 확인.

 

pam_succed_if

주어진 조건이 참일 경우 성공 값 반환, 인자로 quiet가 들어갈 경우 syslog에 알리지 않는다.

 

 

5. PAM 설정하기

 

우리가 다룰 설정 파일은 /etc/pam.d 디렉토리에 있다. /etc/security 디렉토리에 있는 특정 모듈에 적용되는 설정 파일을 변경하려면 모듈과 함께 잇는 문서를 확인해야 한다.

 

/etc/pam.d 디렉토리에 있는 각각 PAM 설정 파일의 형식은 다음과 같다.

 

[module-type][control-flag][module-path][module-arguments]

 

1) module-type

 

PAM이 어떤 타입의 인증이 사용될 것인가를 지정

모듈 타입

설명

비고

auth

사용자 인증에 사용하며, 올바른 비밀번호인지 확인하는 절차를 가진다.

응용 프로그램이 사용자에게 비밀번호를 입력하도록 안내하고, 사용자와 해당 사용자의 그룹에 대한 권한을 인증한다.

 

account

사용자의 접근 허가 여부를 확인하며 계정 만료, 특정 시간대에 접근이 허용되었는지 여부를 확인한다.

인증하는 기능이 아니며 현재 시간, 사용자의 위치와 같은 다른 요소들의 접근 권한을 결정하는데, 예로 root 사용자의 로그인은 콘솔로만 한다. 이런 식으로 결정하는 것이다.

 

password

비밀번호를 설정하고 확인한다.

비밀번호를 기준에 맞게 변경하도록 하는 모듈을 지정한다.

 

session

사용자가 인증 받기 전후에 필요한 홈 디렉토리 마운트, 메일박스 생성 등의 유저 섹션을 구분하기 위해 부가적인 작업을 수행한다.

혹시라도 사용자의 로그인 전후에 수행해야 할 작업이 있다는 내용을 지정한다.

 

 

2) contol-flag

PAM에서 사용되는 모듈들이 결과에 따라 어떠한 동작을 취해야 하는지를 지시한다.

flag

설명

비고

required

인증이 거부되기 전에 PAM이 이 서비스에 등록된 모든 모듈들을 요구함에도 불구하고 실패할 경우 인증을 거부하도록 한다.

해당 모듈은 개별 사용자에 대한 인증을 반드시 진행해야 한다. 인증이 안될 경우 실패가 반드시 반환되어야 한다.

 

requisite

이 모듈을 이용하는 인증이 실패할 경우, 즉시 인증을 거부하도록 한다.

required와 비슷하지만 이 플래그가 인증을 실패할 경우 설정 파일에서 이 값 다음으로 나오는 모듈들을 호출되지 않는다. 실패한 결과는 즉시 응용 프로그램으로 전달된다.

 

sufficient

이전에 요청되어진 모듈이 실패하더라도 이 모듈에 의해서 인증이 성공할 경우 PAM은 인증을 승인한다.

모듈이 성공 값을 반환하고 설정 파일에서 required sufficient 제어 플래그가 필요하지 않다면 PAM은 해당 응용 프로그램에서 성공을 반환한다.

 

optional

이 모듈이 성공 또는 실패하는지는 그 모듈이 서비스에 대한 형식에 유일한 모듈일 경우에 해당한다.(성공 여부 상관 X)

이 제어 플래그는 모듈의 결과를 무시한다. PAM으로 다른 모듈을 지속적으로 확인하도록 한다. 확인 작업이 실패하게 되더라도 계속 진행하게 된다.

특정 모듈이 실패하더라도 사용자가 로그인하는 것을 허용하고자 할 때 리 플래그를 사용하면 된다.

 

include

이 플래그는 인자(argument)에 지정된 또 다른 설정 파일의 내용이나 지침을 포함시키기 위해 사용된다. , 서로 다른 PAM 설정 파일의 내용을 연결하고 구성하는 방식으로 사용된다.

 

 

3) module-path

 

PAM에게 어떤 모듈을 사용할 것인지 그리고 그것을 어디서 찾을지를 알려준다.(인증 작업을 수행하는 모듈이 있는 실제 디렉토리 경로를 지정해 준다) 대부분 구성은 로그인 구성 파일의 경우 마찬가지로 모듈의 이름만 가지고 있다. 이와 같은 경우, PAM은 기본 PAM 모듈의 디렉토리(/lib64/security 또는 /lib/security) 모듈을 찾는다.

 

4) module-arguments

 

모듈에게 전달되는 인수를 나타낸다. 각각의 모듈들은 각각의 인수를 가지고 있다.

arguments

설명

비고

debug

시스템 로그에 디버깅 정보를 남기다.

 

no_warn

응용 프로그램에 경고 메시지를 제공하지 않는다.

 

use_first_pass

비밀번호를 두 번 확인하지 않는다. 대신 auth 모듈에서 입력한 비밀번호를 사용자 인증 과정 시에도 재사용 해야 한다.(이 옵션은 auth password 모듈에 해당하는 옵션임)

 

try_first_pass

이 옵션은 use_first_oass 옵션과 비슷한데, 사용자는 두 번 비밀번호를 입력할 필요가 없기 때문이다. 하지만 기존의 비밀번호를 다시 입력하도록 되어 있다.

 

use_mapped_pass

이 인자는 이전 모듈에서 입력된 텍스트 인증 토큰을 입력 받도록 하는데, 이 값으로 암호화 또는 암호화가 해제된 키 값을 생성한다. 그 이유는 모듈에 대한 인증 토큰 값을 안전하게 저장하거나 불러오기 위함이다.

 

expose_account

이 값은 모듈로 하여금 계정 정보를 중요하다고 판단하지 않게 한다. 시스템 관리자에 의해 임의로 설정한 것이라 여겨진다.

 

nullok

이 인자는 호출된 PAM 모듈이 null 값의 비밀번호를 입력하는 것을 허용한다.

 

 

) /etc/pam.d/su의 내용

제일 먼저 "auth  sufficient  pam_rootok.so" 모듈을 사용하여 인증을 확인하고 성공 시 남은 모듈도 모두 성공처리, 실패 시 남은 모듈을 차례대로 확인한다.(pam_rootok.so root 계정이면 성공, 일반 계정이면 실패를 반환하는 모듈이다)

 

) /etc/pam.d/remote의 내용

"auth  required  pam_securetty.so" pam_securetty.so 모듈을 사용하여 인증을 확인한다. 성공 시 남은 모듈 확인, 실패 시 남은 모듈을 확인 하지만 접근은 실패(pam_securetty.so root 계정이 접근할 수 잇는 터미널이 지정되어 있는 모듈)

 

"auth  substack  password-auth"은 윗 줄에서 성공 값이 반환되면 password-auth 설정 파일에서 입력한 암호와 계정의 암호가 일치하는지 확인한다. 성공 시 최종 성공 처리, 실패 시 최종 실패 처리

 

) /etc/pam.d/system-auth의 내용

내용

설명

auth required pam_env.so

Pam_env.so 모듈을 사용하여 인증을 확인한다. 성공 시 남은 모듈 확인, 실패 시 남은 모듈을 확인 하지만 접근은 실패(pam_env.so는 설정 파일에서 환경 변수를 불러온다. /etc/environment, /etc/security/pam_env.conf)

auth sufficient pam_fprintd.so

password prompt를 대신하는 인증 서비스 중 한가지이다. 현재 사용되지 않으며 무조건 실패 처리

auth sufficient pam_unix.so nullok try_first_pass

/etc/passwd, /etc/shadow 파일과 비교하여 비밀번호를 검증한다.

nullok: 공백 비밀번호를 허용

try_first_pass: 이전에 입력 받은 비밀번호로 인증을 시도, 비밀번호가 없다면 사용자에게 물어본다.

auth requisite pam_succeed_if.so uid < 1000 quiet

uid 1000 보다 작으면 인증을 수행한다.

quiet: 로그를 남기지 않는다.

 

6. pam_nologin.so & pam_securetty.so

 

/etc/nologin 파일이 존재하면 root만 로그인이 가능하고, 일반 사용자는 로그인이 거부된다. "account  required  pam_nologin.so" 설정으로 인해 /etc/nologin 파일이 있으면 사용자들의 접근이 거부된다.

 

/etc/nologin 파일이 생성되면, root 사용자만 로그인이 가능하며, /etc/nologin 파일의 내용과는 상관없이 파일의 생성유무만 판단한다.

 

7. ssh 접속 제한

 

ssh 접속을 제한하기 위해 다음과 같이 vi 명령어를 사용하여 다음과 같은 내용을 추가한다.

$ vi /etc/pam.d/sshd

auth  required  pam_listfile.so  item=user  sense=deny  file=/etc/ssh/sshusers  onerr=succeed

 

추가 후 /etc/ssh/sshusers 파일을 생성한 후 ssh 접속을 제한할 사용자를 다음과 같이 입력한다. (파일 경로와 파일명은 임의로 설정

$ vi /etc/ssh/sshusers

nuriapp

nuriotp

nuripam

nurifds

 

저장 후 해당 계정으로 ssh 접속을 시도할 경우 "Access denied" 메시지를 출력하며 접속이 불가능.

 

8. PAM 설정 파일의 예

 

/etc/pam.d/login 파일의 내용이다.

#%PAM-1.0

auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so

auth       include      system-auth

account    required     pam_nologin.so

account    include      system-auth

password   include      system-auth

# pam_selinux.so close should be the first session rule

session    required     pam_selinux.so close

session    optional     pam_keyinit.so force revoke

session    required     pam_loginuid.so

session    include      system-auth

session    optional     pam_console.so

# pam_selinux.so open should only be followed by sessions to be executed in the user context

session    required     pam_selinux.so open

 

9. PAM 프로그래밍

 

아래 소스 코드는 PAM 모듈의 기본 형태로 "#if 0"으로 막혀 있는 부분에 통제를 할 수 있는 코드를 넣어 두면 원하는 동작(차단 또는 허용, 로그 기록)을 쉽게 처리할 수 있다.

/* pam_test.c */

 

#include <stdio.h>

#include <stdlib.h>

#include <security/pam_appl.h>

#include <security/pam_modules.h>

 

#ifdef PAM_MODULE_ENTRY

PAM_MODULE_ENTRY("pam_test");

#endif

 

#ifndef PAM_EXTERN

#define PAM_EXTERN extern

#endif

 

PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char **argv) {

    return PAM_SUCCESS;

}

 

PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {

    return PAM_SUCCESS;

}

 

PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {

    return PAM_SUCCESS;

}

 

PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {

    return PAM_SUCCESS;

}

 

PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char **argv) {

    return PAM_SUCCESS;

}

 

/* expected hook, this is where custom stuff happens */

PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags,int argc, const char **argv) {

#if 0

    // 아래 조건을 만족하지 못할 경우 로그인 실패로 처리함

    if (check_auth_pam(pamh) < 0)

        return PAM_PERM_DENIED;

#endif

    return PAM_SUCCESS;

}

 

위에 있는 pam_sm_...으로 된 함수들이 사용자가 임으로 추가한 함수가 아니라 PAM에서 기본 함수들로서 해당 함수 부분에 원하는 동작 코드를 넣도록 되어 있다.

 

PAM 모듈 자체게 기존에 동작하는 telnet이나, ssh, login 바이너리에 동적 라이브러리 형태로 붙기 때문에 위 코드에 삽입한 코드들은 로그인과 동시에 해당 서버로의 접속자의 모든 상황들을 감시하고 제어할 수 있다.

 

10. OS PAM 컴파일 방법

 

PAM 인증 모듈은 Linux/Unix의 특성별 OS에서 제공하는 최적화 옵션에 따라 컴파일 하는 방법은 다음과 같다.

 

1) Linux

gcc -fPIC -fno-stack-protector -c pam_test.c

ld -x --shared -o pam_test.so pam_test.o

cp pam_test.so /lib/security/ or /lib64/security/

chmod 555  /lib/security/pam_test.so or /lib64/security/pam_test.so

chown root /lib/security/pam_test.so or /lib64/security/pam_test.so

 

2) HP-UX

cc -c pam_test.c

ld -b -G -o pam_test.so pam_test.o

cp pam_test.so /usr/lib/security/ or /usr/lib64/security/

chmod 555  /usr/lib/security/pam_test.so or /usr/lib64/security/pam_test.so

chown root /usr/lib/security/pam_test.so or /usr/lib64/security/pam_test.so

 

3) AIX(XLC)

cc -c pam_test.c -ldl -lc -lpam  -lcfg -lodm

cc -G -o pam_test.so pam_test.o -ldl -lc -lpam  -lcfg -lodm 

cp -pf pam_test.so /usr/lib/security/ or /usr/lib64/security/

chmod 555  /usr/lib/security/pam_test.so or /usr/lib64/security/pam_test.so

chown root /usr/lib/security/pam_test.so or /usr/lib64/security/pam_test.so

 

4) Solaris(gcc)

gcc -c -o pam_test.so pam_test.c

cp -pf pam_test.so /usr/lib/security/ or /usr/lib64/security/

chmod 555       /usr/lib/security/pam_test.so or /usr/lib64/security/pam_test.so

chown root:root /usr/lib/security/pam_test.so or /usr/lib64/security/pam_test.so

 

11. PAM 환경설정

 

보통 Unix의 경우에는 /etc/pam.conf에 서비스에 따라 아래와 같은 내용을 추가해 주면 되고, Linux의 경우는 /etc/pam.d/ 디렉토리 안에 서비스마다 별도 설정을 해줘야 한다. 단 설정 양식은 아래와 비슷하다.

login   auth required /usr/lib/security/pam_test.so common

ftp     auth required /usr/lib/security/pam_test.so ftp

sshd    auth required /usr/lib/security/pam_test.so ssh

telnet  auth required /usr/lib/security/pam_test.so telnet

rsh     auth required /usr/lib/security/pam_test.so rsh

rlogin  auth required /usr/lib/security/pam_test.so rlogin

dtlogin auth required /usr/lib/security/pam_test.so dtlogin

 

PAM설정이 되어 있는 경우 PAM모듈 프로그램이 잘못되거나 환경설정 파일 수정에 실수가 있는 경우, 그 순간부터 신규 접속은 모두 차단된다.

 

따라서 반드시 작업 전에 telnet/ssh 창을 접속해 둔 다음 테스트 하시고, 테스트 중에 문제가 발생한 경우 이전에 붙여 놓았던 창을 이용하여 복원해야 한다.

 

12. BaroPAM 인증 모듈

 

웹 서버, AP서버, DB서버 등 수 십에서 수 백 대의 서버를 관리하는 IT 기업의 운영자들은 웹 사이트의 계정 이외에도 서버 운영체제에 존재하는 여러 계정들에 대한 비밀번호도 관리해야 한다.

 

개인 사용자들의 계정과 비밀번호와는 달리 서버 운영체제의 계정은 유출될 경우 보안 관점에서 매우 치명적인 문제가 발생할 수 있기 때문에 특별하게 관리되어야 한다.

 

비밀번호의 관리 문제로 인해 여러 비밀번호 관리 솔루션 들이 출시 되었지만 비밀번호가 복호화 가능한 암호화 기법으로 DB에 저장된다는 점에서 컴플라이언스 측면의 문제가 있다. 단지 비밀번호 관리의 편의성만을 강조한 솔루션들이기 때문이다.

 

때문에 2차 인증이 추가적으로 적용되어야 한다. 그래서 2013 12월 개정된 금융감독 규정에 서버의 계정으로 접속 시 2차 인증 의무화가 명시 되어 있다.

 

 

2 Factor 인증은 기존의 "지식기반 인증" ID/Password 인증에 다른 요소 즉 소유기반 인증 및 생체인증 요소를 추가한 인증 기법을 말한다.

 

2 Factor 인증기법은 인증 과정이 추가하면 ID/Password를 알고 접속하려는 사용자에게 OTP 인증 번호나 지문 등의 추가 인증을 요구함으로써 스니핑과 같은 ID/Password 유출에 의한 공격을 방어할 수 있다. 하지만 최근에는 APT 공격 등에 의해 단순한 2 Factor 인증(2차 인증) 기법이 무력화 되는 경우가 발생하기도 한다.

 

특히 웹 서비스나 스마트폰 기반의 서비스는 이러한 단순한 2차 인증(2 Factor 인증)만으로는 해킹을 방어하지 못하는 사례가 발생하기도 한다. 그 이유는 바로 메모리 해킹 때문이다. PC나 스마트폰에 설치된 악성코드가 사용자가 입력한 2차 인증 정보 혹은 인증 후 실 거래 발생 시 거래 정보를 암호화하여 네트워크로 전송하기 직전에 거래 정보를 가로채 변조하는 고도의 프로그래밍 기술을 적용한 악성코드를 사용하기 때문이다.

 

 

2 Channel 인증은 2 Factor 인증을 포함한다고 보는 것이 일반적이며 인증과 서비스를 수행하는 통신선로를 서비스 채널과 인증채널로 물리적으로 분리하는 것이 특징이다.

 

즉 서비스를 사용하는 PC/스마트폰의 통신 채널과 서비스에 모두 사용하는 것이 아니라 PC가 서비스 채널인 경우 ARS(전화) 혹은 스마트폰 앱 등을 통해 서비스를 사용하는 PC 와는 물리적으로 다른 채널을 형성하여 2차 인증을 수행하는 것이다. 이렇게 서비스 채널과 인증 채널을 물리적으로 분리함으로써 해커에 의해 PC 혹은 스마트폰이 장악 되더라도 해커가 서비스에 접근할 수 없게 된다.

 

여기서 한걸음 더 나아간다면 금융거래나 구매 거래 시 관련 데이터를 2 채널 인증에 의해 확립된 2개의 채널로 분리하여 전송한 뒤 결제 시스템에서 조합하여 거래를 완성 시키는 2 채널 서비스 구성도 검토해 볼 수 있겠다.

 

먾은 보안 솔루션들 특히 서버 접근제어 솔루션(SAC)들이 2 Factor/2 Channel 인증을 제공하고 있다. 하지만 네트워크 수준에서 2 Factor/2 Channel 인증을 수행할 경우 제대로 된 2 Factor/2 Channel 인증을 수행할 수 없다.

 

 

위의 개념도에서 알 수 있듯 네트워크 수준에서 수행하는 서버 접근제어의 2차 인증은 사용자와 서버 접근 제어 장비까지의 구간만 2차 인증이 수행되고 실제 서버에 접근하는 접속 세션에서는 여전히 ID Password에 기반한 단순한 인증만이 수행된다.

 

게다가 비밀번호의 관리 편의성을 높이고 사용자가 서버의 계정에 대한 Password를 알지 못하게 하기 위해 서버접근제어 서버에 "복호화가 가능한" 형태로 모든 서버의 계정에 대한 Password를 저장한다. 이는 "Password는 복호화가 불가능한 형태로 암호화" 해야 한다는 가장 기본적인 보안 규정을 어기는 중대한 보안 취약성이다. 개인정보보호법에는 사용자의 비밀번호는 복호화가 불가능한 단방향 암호화를 하도록 명시되어 있음을 유의해야 한다.

 

서버에 대한 2 Factor 인증 및 2 Channel 인증은 서버 운영체제의 자체 인증 과정에 추가하여 추가하여 적용되어야만 우회 접속 및 여러 인증 취약성 공격 기법에서 자유로울 수 있다. 관리의 편의 성 만을 생각한다면 모를까 제대로 된 서버 접근 통제를 하기 위해서는 필수적으로 운영체제에 추가적인 인증 모듈을 적용하여야 한다.

 

Unix/Linux의 경우 운영체제에서 PAM(Plugable Authentication Module)이라는 2 Factor/2 Channel 인증을 적용할 수 있는 모듈을 제공하며, Windows의 경우 GINA/CP라는 추가 인증을 적용할 수 있는 모듈을 제공하고 있다. 그럼에도 불구하고 개발의 편의성, 관리의 편의성은 증대될지 모르나 실질적인 보안 강화 효과는 그다지 기대하기 어렵다고 볼 수 있다.

 

또한 수 많은 서버와 네트워크 장비를 운용하며 Password 관리에 골치를 앓고 있는 기관과 기업의 어려움을 파고들어 제대로 된 보안 강화 솔루션이 아닌 보안 강화 효과도 별로 없는 솔루션을 공급하는 것은 상도덕에도 어긋난다고 할 수 있다.

 

사실 특정 보안 솔루션만으로 모든 보안 취약성을 커버할 수는 없는 것이 사실이다. 해킹은 지속적이고 지능적으로 변화하고 있으며 네트워크 기반의 보안 만으로는 더 이상 서버에 저장된 정보를 보호할 수 없다.

 

개인정보를 비롯한 기관과 기업의 중요 데이터는 "서버"에 저장되어 있다. 서버의 보안을 강화하지 않고 길목인 네트워크에서 어떻게든 보안을 강화해보려는 구태의연한 보안은 이제 더 이상의 효과를 볼 수 없는 현실을 직시해야 한다. 아울러 외부로부터의 해킹이 아닌 내부 관리자/운영자들에 대한 통제를 빠르고 안정적인 "서비스 개발과 운영"을 핑계로 계속 미룰 경우 지금과 같은 해킹 대란은 계속 발생하고 보안 예산의 낭비는 계속될 수 밖에 없다.

 

BaroPAM Unix/Linux의 운영체제에서 2차 인증으로 BaroOTP를 접목시켜 중앙집중적 인증 매커니즘을 지원하는서버 접근 제어의 솔루션이다.

 

BaroPAM의 특장점은 다음과 같다.

 

-전세계적으로 인정된 512bit 표준해쉬함수(HMAC-SHA512) 사용

-금융감독원에서 권장하는 Time-sync 방식 채택

-인증서버가 별도로 필요하지 않음

-동적 SEED 암호화 알고리즘 방식

-서버별 인증키 부여

-스마트폰을 OTP발생기로 사용하므로 휴대성 및 편의성 극대화

-자체 개발 솔루션으로 다양한 커스터마이징 가능

 

12.1 BaroPAM 인증 절차

 

BaroPAM의 인증 절차는 PAM인증 절차에 2차 인증으로 OTP를 추가 하였다.

 

 

12.2 설치 전 사전 준비사항

 

BaroPAM에서 사용하는 인증 코드인 OTP(One Time Password) Java를 기반으로 작성되었기 때문에 최신 JDK가 설치 되어 있어야 한다.

 

JDK 설치 디렉토리 확인)

[root]# env | grep JAVA_HOME

JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.121.x86_64

 

Java 버젼 확인)

[root]# java -version

java version "1.7.0_121"

OpenJDK Runtime Environment (rhel-2.6.8.1.el5_11-x86_64 u121-b00)

OpenJDK 64-Bit Server VM (build 24.121-b00, mixed mode)

 

BaroPAM에서 사용하는 인증 코드인 OTP(One Time Password) Java를 기반으로 작성하게 되어 있으며 이의 실행을 위해서는 JVM Client 라이브러리인 libjvm.so가 필요하다. 그래서 /lib64 디렉토리에 Soft link를 하는 방법은 다음과 같다.

 

[root]# ln -s $JAVA_HOME/jre/lib/amd64/server/libjvm.so /lib64/libjvm.so

 

12.3 BaroPAM 인증 모듈 다운로드

 

BaroPAM 인증 모듈은 root 계정으로 접속한 후 모듈을 다운로드 하는 방법은 다음과 같다.

 

[root]# wget http://nuriapp.com/download/libpam_baro_authenticator-1.0.tar

 

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

 

[root]# tar -xvf libpam_baro_authenticator-1.0.tar

 

BaroPAM 인증 모듈의 압축을 해체하면 "libpam_baro_authenticator-1.0" 폴더가 생성된다.

 

[root@libpam_baro_authenticator-1.0]# ls -al

-rw-r--r-- 1 root root   1063 11 29 10:23 AnsiX923Padding.class

-rw-r--r-- 1 root root   2105 11 29 10:23 BaroPAM.class

-rw-r--r-- 1 root root   2284 11 29 10:23 Base64Coder.class

-rw-r--r-- 1 root root    170 11 29 10:23 CryptoPaddingImpl.class

-rw-r--r-- 1 root root   2520 11 29 10:23 Seed.class

-rw-r--r-- 1 root root  20799 11 29 10:23 SeedCipher.class

-rwxr-xr-x 1 root root  49288 11 30 11:30 baro-authenticator

-rw-r--r-- 1 root root   4387 11 29 10:23 baropam.class

-rwxr-xr-x 1 root root 134839 11 30 11:30 pam_baro_authenticator.so

 

BaroPAM 인증 모듈을 /lib/security(or /lib64/security) 디렉토리로 pam_baro_authenticator.so 파일을 복사한다.

 

[root@libpam_baro_authenticator-1.0]# cp pam_baro_authenticator.so /lib/security/.

or

[root@libpam_baro_authenticator-1.0]# cp pam_baro_authenticator.so /lib64/security/.

 

만약, 특정 계정만 설치할 경우 BaroPAM 인증 모듈을 설치할 계정의 홈 디렉토리 아래에 복사하는 방법은 다음과 같다.("/home/baropam/"은 임의의 다운로드 받을 디렉토리임)

 

[root@libpam_baro_authenticator-1.0]# cp -rp pam_baro_authenticator.so /home/baropam/.

 

BaroPAM에서 사용하는 인증 코드인 OTP(One Time Password) Java를 기반으로 작성하게 되어 있기 때문에 해당 클래스(BaroPAM.class, baropam.class, Seed.class, SeedCipher.class, Base64Coder.class, CryptoPaddingImpl.class, AnsiX923Padding.class) 파일을 BaroPAM 인증 모듈이 위치한 디렉토리로 복사하는 방법은 다음과 같다.

 

[root@libpam_baro_authenticator-1.0]# cp *.class /lib/security/.

or

[root@libpam_baro_authenticator-1.0]# cp *.class /lib64/security/.

 

만약, 특정 계정만 설치할 경우 BaroPAM 인증 모듈처럼 설치할 계정의 홈 디렉토리 아래에 인증 코드인 OTP관련 클래스를 복사해야 한다.

 

12.3 BaroPAM 인증 모듈 실행

 

BaroPAM 환경 설정 파일은 baro-authenticator 프로그램을 실행하여 생성하는데, root 계정의 홈 디렉토리인 /etc/ssh 밑에 위치 하도록 한다.

 

형식)

baro-authenticator -r rate_limit -R rate_time -H hostname -i ip_addr -S secure_key -s finename

rate_limit: 제한 횟수, rate_time: 제한시간(), hostname: 서버 호스트명, ip_addr: 서버 IP Address, secure_key: Secure key, filename: PAM 환경설정파일명

 

주의) 설정한 서버 호스명과 IP Address가 맞지 않는 경우 BaroPAM이 정상적으로 작동되지 않을 수 있다.

 

사용 예)

[root@libpam_baro_authenticator-1.0]# baro-authenticator -r 3 -R 30 -H qsh-0415.cafe24.com -i 1.234.83.169 -S 9Cy1VzAfxVqDKU37kmRgYpQZ5M9VoOTbMeIu8CKcM/o= -s /etc/ssh/.baro-authenticator

 

만약, 특정 계정만 설치하는 경우 특정 계정으로 접속하여 작업을 진행한다.(Not root)

 

[bropam@libpam_baro_authenticator-1.0]# baro-authenticator -r 3 -R 30 -H qsh-0415.cafe24.com -i 1.234.83.169 -S 9Cy1VzAfxVqDKU37kmRgYpQZ5M9VoOTbMeIu8CKcM/o= -s /etc/ssh/.baro-authenticator

 

1) Do you want authentication token to be time-base (y/n)? y

  시간 기반의 인증 토큰을 사용할 것인가 (y/n)? y

 

2) Your emergency scratch codes are :

  해당 번호는 OTP 입력이 안되거나 사용할 수 없을 때, 접속이 가능한 Super OTP 번호.

  관리자는 ~/ssh/.baro-authenticator root 계정만 읽을 수 있게 권한을 부여하여 다른 사용자 

  Super OTP를 사용하여 접속하는 것을 미연에 방지할 수 있다.

 

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

   같은 비밀번호는 하나의 계정 외에 다른 계정에도 로그인이 가능하게 할 것인가? y

   비밀번호의 제한 시간을 30초로 지정할 것인가? y

 

PAM 환경 설정 파일인 .baro-authenticator의 내용은 다음과 같다.

 

[root]# cat /etc/ssh/.baro-authenticator

JZ74AVEP2TQMX5OR

" RATE_LIMIT 3 30

" SECURE_KEY 9Cy1VzAfxVqDKU37kmRgYpQZ5M9VoOTbMeIu8CKcM/o=

" IP_ADDR 1.234.83.169

" HOSTNAME qsh-0415.cafe24.com

" WINDOW_SIZE 17

" DISALLOW_REUSE

" TOTP_AUTH

97856535

89591454

17487966

98116122

27182889

 

12.4 BaroPAM 모듈 환경설정

 

BaroPAM 모듈을 설정하기 위해서 sshd 파일에 설정하는 방법은 다음과 같이 최 상단에 입력해 준다.

 

[root]# cat /etc/pam.d/sshd

#%PAM-1.0

auth       required     /lib64/security/pam_baro_authenticator.so nullok secret=/etc/ssh/.baro-authenticator

 

만약, 특정 계정만 사용할 시에도 root 계정으로 접속하여 PAM 관련 작업을 모두 진행해야 한다.

 

sshd 데몬 설정을 위한 설정 파일인 sshd_config 파일의 내용 중 다음과 같은 인자는 변경이 필요하다.

 

인자

기존

변경

비고

PasswordAuthentication

yes

no

 

ChallengeResponseAuthentication

no

yes

 

UsePAM

no

 

 

 

sshd 설정이 끝나면 SSH Server Restart 작업이 반드시 필요하다. 특정 계정만 사용 시에도 sshd 설정이 완료되면 Restart 작업이 반드시 필요하다.

 

[root]# service sshd restart

sshd 를 정지 중: [  OK  ]

sshd ()를 시작 중: [  OK  ]

 

서버 시간이 현재 시간과 다를 경우 OTP 번호와 매칭이 되지 않아 인증 코드가 맞질 않으므로 시간을 같게 초기화 하는 방법은 다음과 같다.

 

#Time setting

11 4 * * * /usr/bin/rdate -s time.simplexi.com; /sbin/hwclock --systohc

or

11 4 * * * /usr/bin/rdate -s time.bora.net;

 

12.5 서버 접속 방법

 

Putty로 접속할 때 보통 접속 과정과 동일하게 해주시면 되는데, 하나 설정해 주어야 할 것이 있다. 환셩 설정에서 "connection -> SSH -> auth"에서 attempt "Keyboard-Interactive" auth(SSH-2)를 선택한 후 ssh 접속을 하면 된다.

 

 


Verification code에 입력할 OTP 발생기)

어플 다운로드: http://www.nuriapp.com/apk/app_baropam.apk

 

 


putty인 경우)

 

 


Mobile SSH인 경우)