본문 바로가기

Linux/보안

사용자 보안 - PAM


PAM (Pluggable Authentication Module)
- 사용자 인증을 모듈화 하고 관리자가 응용프로그램들의 사용자 인증 방법을 선택하고 설정할 수 있다.
즉, 사용자를 인증하고 사용자의 서비스에 대한 액세스를 제어하는 모듈이다.

/etc/pam.d - 어플리케이션별 pam설정 파일 위치 디렉토리
/lib/security - pam 모듈 디렉토리

-------------------------------------------------------------------

관련 사이트 : http://kldp.org/HOWTO/html/User-Authentication-HOWTO/x106.html

-------------------------------------------------------------------



기본 형식

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

module-type : PAM 이 어떤 타입의 인증이 사용될 기성인가를 지정한다.
- auth : 사용자인증에 사용하며 올바른 패스워드인지 문도 확인하는 절차를 가진다.
- account : 사용자의 접근 허가 여부를 확인하며, 계정만료, 특정 시간대에 접근이 허용되었는지 여부를 확인한다.
- password : 패스워드를 설정하고 확인한다.
- session : 사용자가 인증 받기 전후에 필요한 홈 디렉토리 마운트, 메일박스 생성 등의 유저섹션을 구성하기 위해 부가적인 작업을 수행한다.

control-flag : PAM에서 사용되는 모듈들이 결과에 따라 어떠한 동작을 취해야 하는지를 지시한다.
- required : 인증이 거부되기 전에 PAM이 이 서비스에 등록된 다른 모든 모듈들을 요규함에도 불고하고 실패할 경우 인증을 거부하도록 한다.
- requisite : 이 모듈을 이용하는 인증이 실패할 경우, 즉시 인증을 거부하도록 한다.
- sufficient : 이전에 요청되어진 모듈이 실패하더라도 이 모듈에 의해서 인증이 성공할 경우,  PAM은 인증을 승인한다.
- optional : 이 모듈이 성공 또는 실패하는지는 그 모듈이 서비스에 대한 형식에 유일한 모듈일 경우에 해당한다.(성공 여부는 상관없음)

module-path : PAM에게 어떤 모둘을 사용할 것인지 그리고 그것을 어디서 찾을 지를 알려준다. 대부분 구성은 로그인 구성 파일의 경우와 마찬가지로 모듈의 이름만 가지고 있다. 이와 같은 경우, PAM은 기본 PAM 모듈의 디렉토리에서 (/lib/security) 모듈을 찾는다.

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




1. pam_nologin.so & pam_securetty.so
- /etc/nologin 파일이 존재하면 root 만 로그인이 가능하고 일반 사용자는 로그인이 거부된다.

 
[root@server3 pam.d]# vi /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
- /etc/securetty 파일에 기록된 내용과 비교하여 root 사용자가 로그인 가능한 콘솔을 확인한다.

auth       include      system-auth
account    required     pam_nologin.so
- 이 설정으로 인해 /etc/nologin 파일이 있으면 사용자들의 접근이 거부된다.

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    include      system-auth
session    required     pam_loginuid.so
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
session    optional     pam_keyinit.so force revoke


[root@server3 pam.d]# touch /etc/nologin
- /etc/nologin 파일이 생성되면 root 사용자만 로그인이 가능하다. /etc/nologin 파일의 내용과는 상관없이 파일의 생성 유무만 판단한다.


[root@server3 pam.d]# ls -l /etc/nologin

-rw-r--r-- 1 root root 0  1월 29 11:47 /etc/nologin




2. pam_listfile.so
- 임의의 파일에 대해 서비스를 허가 하거나 거부하는 방법을 제공한다.

 
[root@server3 ~]# vi /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      system-auth
account    include      system-auth
session    include      system-auth
session    required     pam_loginuid.so

참고
- item=user / tty / rhost / ruser / group / shell
아이템을 지정한다. 사용자, 터미널, 원격사용자, 그룹, 쉘 등을 사용할 수 있다.
- sense=deny / allow
센스를 지정한다. allow 또는 deny 값을 넣을 수 있다.
- file=/etc/vsftpd/ftpusers
아이템에 맞는 임의의 파일을 지정한다.
- onerr=succeed / fail
sense 값에 반대로 적어둔다.




3. ssh 접속 제한

 
root 계정에 ssh 로그인 금지하기
[root@server3 pam.d]# vi /etc/ssh/sshd_config
36 # Authentication:
37
38 #LoginGraceTime 2m
39 #PermitRootLogin yes
40 PermitRootLogin no - ssh 사용시 root로의 접속은 막고 일반 사용사의 접속은 가능하다.(#ssh 10.10.33.2 -l test2)
                                        하지만 접속을 막기 원하는 일반 사용자는 선택할수 없다.   
41 #StrictModes yes
42 #MaxAuthTries 6

-------------------------------------------------------------------

PAM을 사용한 루트 계정 로그인 금지하기

[root@server3 pam.d]# vi /etc/pam.d/sshd
#%PAM-1.0
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/sshusers onerr=succeed
- 이부분을 추가해주고 /etc/ssh/sshusers를 생성해준다.(파일 경로나 이름은 마음대로 설정하면 된다.)

auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so

[root@server3 pam.d]# vi /etc/ssh/sshusers - 파일을 새로 만들어 준다.
test2 - ssh 접속을 제한할 사용자를 입력해준다. 이렇게 해주면 ssh 접속을 원하지 않는 일반 사용자의 접속을 선택해서 막을 수 있다.




4. pam_rootok.so
- root가 암호 입력없이 해당 서비스에 접근을 허용할 때 사용한다.

 
[root@server3 ~]# vi /etc/pam.d/su
#%PAM-1.0
auth            sufficient      pam_rootok.so - 이부분을 주석처리하면 root도 su명령어 사용시 패스워드를 입력해야 한다.

# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid
auth            include         system-auth
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
account         include         system-auth
password        include         system-auth
session         include         system-auth
session         optional        pam_xauth.so




5. pam_time.so
- 특정 서비스에 대해 시간대 별로 접근 제어를 한다.

 
[root@server3 ~]# vi /etc/pam.d/login
#%PAM-1.0
account    required     pam_time.so  - /etc/pam.d/login 파일에 모듈 내용을 추가한다.
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    include      system-auth
session    required     pam_loginuid.so
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
session    optional     pam_keyinit.so force revoke

[root@server3 ~]# vi /etc/security/time.conf - pam_time.so 모듈 환경설정 파일이다.

#service;ttys;users;times - 형식에 맞게 추가해준다.
login;tty* & !ttyp*;!root;Al0900-1800 - root 사용자를 제외한 모든 사용자는 매일 09시 부터 18시 까지만 콘솔 로그인이 가능하다.


참고
service : 규칙이 적용될 서비스의 이름을 지정한다. login, sshd 등
tty  : 규칙을 적용할 터미널의 이름을 지정한다. tty*, ttyp*(pts:원격접속터미널)
users : 적용할 사용자 이름을 지정한다.
times : 언제 이 규칙을 적용할 것인가를 지정한다.
(Al : 매일, Mo : 월, Th : 화, We : 수, Th : 목, Fr : 금, Sa : 토, Su : 일, Wk : 주중, Wd : 주말)

!root : root를 제외한 모든 사용자
Al0900-1800 : Al : 매일, 0900-1800 : 09시 부터 18시까지의 시간


예) ssh 일반 사용자, 주중, 09-18 에만 접속가능하게...
[root@server3 ~]# vi /etc/pam.d/sshd
#%PAM-1.0
account    required     pam_time.so
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/sshusers onerr=succeed
auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so

[root@server3 ~]# vi /etc/security/time.conf
sshd;tty* & ttyp*;!root;Wk0900-1600




6. pam_limits.so
- 특정 서비스에 대해 자원을 제한 하거나 제어를 한다. 프로세스 수 및 메모리의 양을 제어하여 로콜에서의 컴파일이나 서비스 거부 공격등을 방지할 수 있다.
- 이 설정이 활성화 되어 있으면 가상 콘솔창에서 로그인 이 거부될 수 있다.

 
[root@server3 ~]# vi /etc/pam.d/login
#%PAM-1.0
account    required     pam_limits.so - 모듈의 내용을 추가한다.
account    required     pam_time.so
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    include      system-auth
session    required     pam_loginuid.so
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
session    optional     pam_keyinit.so force revoke

[root@server3 ~]# vi /etc/security/limits.conf
#Each line describes a limit for a user in the form:
#
#<domain>      <type>      <item>         <value> - 형식에 맞게 추가해준다.
test1            hard    maxlogins       3 - test1 사용자는 동시 접속을 3개로 제한한다.


참고
domain : 사용자 명 또는 와일드카드 *, @group 등을 사용할 수 있다.
type : soft, hard 값을 사용하며, soft limit 는 일반 유저가 변경할 수 있지만, hard limit는 root 사용자만 변경할 수 있다.
item : 아이템을 사용하여 제한한다. (core : 코어파일, data : 데이터, fsize : 파일, rss : 메모리 사이즈, nproc : 프로세스 개수, maxlogins :  동시접속 개수)
value : 제한 값을 지정한다.




7. 기타

 
[root@server3 ~]# vi /etc/profile or .bash_profile
TMOUT=3600
HISTSIZE=50

참고
TMOUT
: 계정의 접속시간을 제한하는 경우에 추가해준다. 기본 단위는 초(sec)이다.
HISTSIZE : 히스토리 값에 대해서 보안을 강화하기 위하여 변경해준다.

-------------------------------------------------------------------

[root@server3 ~]# vi /etc/security
console
#vc/1
#vc/2
- 접속을 허용할 터미널만 설정하고 나머지는 주석처리하여 root 사용자의 터미널 접속을 제한한다.

-------------------------------------------------------------------