정보보안공부

시스템보안_Linux_PAM 정책 본문

정보보안/시스템보안

시스템보안_Linux_PAM 정책

Steady_sp 2018. 11. 7. 00:33

시스템보안_Linux_PAM 정책

- Vmware 가상머신 사용

- CentOS6.0

 

<리눅스 PAM 정책>

 

#1 PAM (Plaggable Authentication Module)

-> 인증이 필요한 다양한 프로그램, 서비스와 무관하게 다양한 관리가 설정 가능 방식으로 사용자를 인증해주는 것이다.

-> PAM 라이브러리 확장자 .SO는 윈도우의 DLL과 같은 개념이다. 업데이트에 대한 편리성이 있다.

-> 사용자 인증 방식과 무관하게 프로그램을 개발할 수 있어 별도 인증 과정을 프로그램에 내포하지 않아도 된다.

-> PAM을 사용할 때는 유틸리티가 실행되면서 다양한 인증 모듈을 호출해서 사용자 인증 과정을 수행하고 모듈 결과에 따라 알맞은 행동을 취한다.

 

*** PAM 라이브러리 관련 설정파일

- /etc/pam.d : PAM 라이브러리를 이용하는 응용프로그램의 설정 파일 위치, 파일명은 서비스 이름으로 되어있다.

- /etc/security : PAM 모듈 실행에 필요한 설정 파일, 파일명은 해당 서비스명.conf

- /lib/security : PAM 라이브러리가 제공하는 인증 모듈들,라이브러리(*.so)로 구현되어 있다.

 

#2 PAM 구성 파일 문법

type        control        module-path        module-arguments

 

**type : PAM에게 어떤 타입의 인증이 사용될 것인지 지정

- auth : 사용자 인증에 사용, 올바른 패스워드인지 절차를 거친다.

- account : 계정 관리, 사용자의 위치, 시간, 권한 등을 확인 절차를 가진다.

- password : 사용자가 패스워드 변경할 수 있는 모듈을 지정한다.

- session : 로그인 전후 수행되는 일을 지정, 예를 들면 로그 기록

 

**control : PAM에서 사용되는 모듈의 결과에 따라 동작을 지정

- required : 성공 값 반환 시 성공 후 다음꺼 진행, 실패 시 마지막까지 다 실행 후 실패한다.

- requisite : 성공 값 반환 시 성공 후 다음꺼 진행, 실패 시 곧바로 실패한다.

- sufficient : 성공 값 반환 시 곧바로 성공, 단 위에서 required 실패시 실패한다.

 

**module-path : 사용할 모듈의 위치

- 상대경로 시 /lib/security

 

** module-arguments : 모듈에게 전달되는 인수

- no_warn : 경고 메시지 없다.

- use_first_pass : 패스워드를 요구 하지 않음, 패스워드가 없다면 인증받지 못한다.

- try_first_pass : 입력받은 패스워드로 인증을 시도, 없다면 사용자에게 물어본다.

 

#3 /etc/pam.d 설정파일

 

*** /etc/pam.d/su

#> vim /etc/pam.d/su

-> su명령어 사용시 적용

 

 

* pam_rootok : 암호없이 root의 접근을 허용한다.

 

 

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

-> /etc/group에서 wheel 그룹에 사용자들을 추가할 수 있다.

 

 

-> user1이 wheel 그룹에 속해있어서 다른 계정으로 su할때 다른계정의 비밀번호없이 바로 가능하다. user2는 계정에 속해있지 않기 때문에 다른계정의 비밀번호를 입력해야 가능하다.

 

 

-> control 부분을 sufficient에서 required로 변경하면 su를 사용하려는 사용자가 wheel 그룹에 없으면 실패이기 때문에 su를 사용할 수 없다.

-> user2는 wheel 그룹에 없으므로 su 사용불가

 

 

-> include    system-auth는 /etc/pam.d/system-auth 파일을 include해서 사용한다.

 

*** /etc/pam.d/system-auth

#> vim /etc/pam.d/system-auth

 

 

* pam_env.so : 환경변수를 불러와 적용한다. 설정파일이 기본적으로 설정되어 있지 않기에 성공한다.

* pam_fprintd.so : 패스워드 프롬프트를 대신하는 인증 서비스, 현재는 사용되지 않는다.

* pam_unix.so : 암호를 확인하고 변경 시 사용되는 모듈, 유닉스의 기본 패스워드 인증 모듈, /etc/passwd 와 /etc/shadow 파일을 통해 인증 성공유무를 판단한다.

* pam_succeed_if.so : 조건 모듈, C언어의 if문과 유사하다. 주어진 조건이 참일 경우 성공이다.

 

-> /etc/pam.d/su 에 system-auth를 include하고 있기 때문에 system-auth파일을 변경하게되면 su파일에도 적용이된다.

-> 위에 빨간부분 3줄이 user1계정만 root로 su가능하고 나머지 계정들은 root로 su접근이 불가능하도록 하는 설정이다.

-> user != root : su의 대상이 root가 아니면 sufficient로 인해 성공

-> user = user1 use_uid : su의 대상이 user1이면 sufficient로 인해 성공

 

 

-> user1만 root로의 접속이 가능하고 나머지 계정들은 root로 접속할 수 없다.

=> root는 관리자이기 때문에 user1계정으로만 사용가능하도록 알고 있는것은 관리자만 알고있으므로 공격자는 user1계정이 root로 su 된다는 것을 알아채기 힘들다.

 

*** /etc/pam.d/remote

#> vim /etc/xinetd.d/telnet

-> telnet명령어가 xinetd에 의해 관리되므로 PAM에 의해 사용자 인증이 적용되도록 xinetd에서 telnet을 사용안하도록 설정한다.

 

 

#> vim /etc/sysconfig/iptables

-> telnet서비스 사용가능하도록 방화벽 설정

 

 

cmd> telnet 1.0.0.222

-> telnet 서비스를 통해 root계정으로 접속해보기

 

 

-> root계정으로 접속이 거부된다.

 

#> vim /etc/pam.d/remote

-> telnet 서비스 사용시 적용

 

 

* pam_securetty.so : root 접근 시 /etc/securetty 파일에 터미널 목록이 없으면 거부한다.

 

-> 주석처리 하거나 /etc/securetty파일에 터미널 목록을 추가하면 root로도 접속이 가능해진다.

 

#> /etc/securetty

-> pts/0 ... 추가

 

 

#> /etc/pam.d/remote

-> pam_securetty.so 주석처리

 

 

** telnet 을 통해 root로 접속가능

 

 

*** /etc/pam.d/sshd

#> vim /etc/pam.d/sshd

 

 

-> ssh도 telnet과 마찬가지로 root로의 접속을 제한하려면 pam_securetty.so 를 사용하면 root사용자로 접근할 수 없다.

 

 

* pam_access.so : /etc/security/access.conf 설정 파일에서 접근을 통제할 내용을 작성할 수 있다. 계정별로 나눠서 거부할 수 있다. + : 허용, - : 거부 , all : 전부를 의미한다.

#> vim /etc/security/access.conf

 

 

-> - : root : ALL 는 root계정에 대해서는 모든 IP로 부거 거부한다.

-> + : user1 : 1.0.0.130 는 user1계정에 대해서는 1.0.0.130 IP만 허용한다.

 

 

-> 모든 IP에 대해서 root로의 접근이 거부된다.

 

 

-> user1계정으로의 접근은 1.0.0.130으로만 허용되있으므로 접근가능하다.

 

* pam_time.so : /etc/security/time.conf 설정 파일에서 접근을 통제할 내용을 작성할 수 있다. 서비스종류;터미널종류;계정;시간값(허용할 시간)

#> vim /etc/security/time.conf

 

 

-> sshd;*;root;Wk1900-2200 는 sshd서비스에 대해 *모든 터미널의 root계정으로 평일 19시부터 22시 사이에는 접근 가능하다.

 

 

-> 현재 시간이 18:29분 이므로 접근 불가능한 상태이다.

 

 

-> 시간을 18시에서 22시 사이로 변경하면 접근이 되어야한다.

 

 

-> 접속성공

 

* pam_tally2 : 어떤아이피에서 어떤계정으로 비밀번호 시도를 몇번했고 마지막 실패 횟수를 알 수있는 설정이다. deny를 사용해 몇번까지 비밀번호가 틀리면 계정이 잠기는지 값을 설정할 수 있다. unlock_time으로 잠금기간을 설정할 수 있지만 일반적으로는 설정하지 않으면 기본값으로 관리자가 계정을 풀기전 까지 사용할 수 없도록 설정한다.

#> vim /etc/pam.d/ssh

 

 

-> deny는 4이므로 패스워드가 4번까지 일치하지 않으면 계정은 바로 잠긴다.

 

 

-> 4번째에 비밀번호가 일치하지 않으면 계정은 잠기게 되어 5번째에 올바른 비밀번호를 입력해도 로그인되지 않는다.

 

 

-> pam_tally2를 이용해 어떤 IP로 부터 어느계정에 비밀번호 틀린횟수와 마지막으로 실패한 시간까지 알 수 있다.

 

 

-> pam_tally2 -u user1 --reset=0 을 이용해 user1 계정이 잠긴 것을 해제한다.

-> 해제후에 pam_tally2를 해보면 기존에 잠겨있던 정보들은 확인할 수 없다.

 

* pam_cracklib.so : 패스워드 구성시 최소길이 설정과 영문소, 영문대, 특수문자, 숫자 별로 credit값 부여가능하고 retry값을 통해 시도횟수를 제한할 수 있다.

 

#> vim etc/pam.d/system-auth

 

 

-> 최소길이의 판단법은 전체 문자의 길이와 대문자,특수문자,소문자,숫자 를 하나라도 사용하면 credit값을 따로 부여해서 더한 값이 총 길이가 된다. credit 값은 각각 부여할 수 있고 기본값은 1이다. 대문자, 특수문자, 소문자, 숫자중 반드시 포함하게끔 설정하려면 credit 값을 -1로 부여해야한다. ( ocredit : 특수문자, ucredit : 영어대문자, lcredit : 영어소문자, dcredit : 숫자 )

 

 

-> retry=3 으로 설정되어 있으므로 3번의 시도가 실패하면 종료된다.

 

Comments