본문 바로가기

Linux

PAM

vi /etc/pam.d/system-auth

 

auth        required      pam_tally2.so onerr=fail deny=3
account     required      pam_tally2.so onerr=fail on_magic_root reset

 

tail /var/log/secure

 

pam_tally2(sshd:auth): user yjj1 (6005) tally 4, deny 3

위와 같은 secure 로그를 뿌려준다.

 

Lock 해제

pam_tally2 –u 유저이름 -r

 

 

====참고====

PAM 구성토큰

type
타입토큰은 PAM에 이 모듈에 어떤 타입의 인증이 사용될 것인지를 알려준다. 같은 타입의 모듈은 "쌓일" 수 있고, 사용자에 인증되기위한 다중 요구사항을 만족하도록 요청할 수 있다. PAM은 네개의 타입을 인식한다.


account
계정은 사용자가 해당 서비스에 접근이 허용되었는지, 패스워드가 기간이 만료가 되었는지를 결정한다.


auth
주로 패스워드를 통하지만 생체인증과 같은 보다 정교한 방법을 통해서 사용자가 자신이 주장하는 사용자가 맞는지 결정한다.


password
패스워드는 사용자가 그들의 인증을 변경하도록 어떤 방법을 제공한다. 다시 이것은 주로 패스워드이다.


session
사용자가 인증받기 전에 또는/그리고 후에 되어야 할 것이다. 이것은 사용자 홈 디렉토리를 마운팅/언마우팅하는 것과 로그인/로그아웃 그리고 사용자에게 제공하는 서비스를 제한/제공하는 것과 같은 것을 포함할 수 있다. 로그인 구성 파일에는 각각의 타입하나에 적어도 한 개의 목록을 볼 수 있다. 이것 때문에 프로그램이 사용자들에 로그인을 허용한다. 모든 다른타입의 인증에 접근할 필요가 있다는 것을 이해할 수 있다.



control
통제 토큰은 이 모듈이 동작하지 않는다면 PAM에게 무엇을 해야할 지 알려주는 것이다. PAM은 네가지의 통제 형식을 인식한다.


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


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

.

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


optional
이 모듈이 성공 또는 실패하는 지는 그 모듈이 서비스에 대한 형식에 대한 유일한 모듈일 경우에 중요하다.

로그인에 대한 구성파일에서 거의 모든 통제타입이 다르다는 알 수 있다. 대부분의 요청되어지는 모듈들은 pam_unix.so(주요 인증 모듈)이고, 단 한 개의 requitsite 모듈은 pam_securitty.so 이다(사용자가 안전한 콘솔에 로그인한다는 것을 확인하는 것이다). 그리고 유일한 선택모듈은 pam_lastlogin.so 이다(사용자의 가장 최근 로그 정보를 가지고 오는 모듈)


모듈-경로
모듈경로는 PAM에게 어떤 모듈을 사용할 것인지(선택적으로) 그리고 그것을 어디서 찾을 지를 알려준다. 대부분 구성은 로그인 구성 파일의 경우와 마찬가지로 모듈의 이름만 가지고 있다. 이와 같은 경우, PAM은 기본 PAM 모듈의 디렉토리에서(보통 /usr/lib/security) 모듈을 찾는 다. 그러나 여러분의 리눅스가 리눅스 파일시스템의 표준을 따른다면 PAM모듈은 /lib/security에 있다.


모듈-인수
모듈-인수는 모듈에게 전달되는 인수이다. 각각의 모듈은 각각의 인수를 가지고 있다. 예를 들어 로그인 구성에서 "nulok"가 그것이다. ("null ok", pam_unis.so 모듈로 전달되어 지는 인수로서 공백(null)패스워드를 허용한다는 것이다("ok")). 


=================================================================


접속자 관련 유틸리티


아래의 명령어들은 사용자의 로그인 정보에 대한 것을 알 수 있는 것들이다.


who : 현재 로그인 된 사용자의 목록을 보여준다. /var/log/utmp 파일을 참고한다.


w : 로그인 되어 있는 사용자가 현재 무슨 작업을 하고 있는지 보여준다.


last : 최근에 로그인 한 사용자의 목록과, 로그인 및 로그아웃 시간, 접속한 곳의 IP등을 보여준다. /var/log/wtmp 파일을 참고한다.


lastb : /var/log/btmp 파일을 참고하는 것과, 모든 접속 시도에 대해서 보여준다는 것을 제외하고는 last 명령과 같다.


lastlog : 사용자가 마지막으로 로그인한 시간을 보여준다. /var/log/lastlog 파일을 참고한다.


ac : 사용자별 또는 날짜별 접속시간을 보여준다. /var/log/wtmp 파일을 참고한다.


dump-utmp : ASCII형식으로 되어 있는 /var/run/utmp 파일 또는 /var/log/wtmp 파일을 raw-data로 변환한다.


ftpwho : 현재 ftp에 접속되어 있는 ftp 사용자들의 현재 프로세스 정보를 보여준다. 출력 형식은 /bin/ps 명령의 형식과 동일하다.


ftpcount : ftpwho 명령의 간략화된 버전이다. 이 명령은 현재 시스템에 ftp를 통해 로그인 되어 있는 사용자의 숫자와 허용할 수 있는 최대 사용자의 숫자만 보여준다.




비밀번호 제한 및 권한 제한 설정

다음과 같은 방법으로 비밀번호를 제한하는 것이 좋다.:


- 비밀번호는 최소 8자로 한다.

- 비밀번호는 적어도 하나의 소문자를 포함한다(no credits).

- 비밀번호는 적어도 하나의 대문자를 포함한다(no credits).

- 비밀번호는 적어도 하나의 숫자를 포함한다(no credits).

- 비밀번호는 적어도 하나의 서로 다른 문자를 포함한다(no credits).

- 이전 비밀번호와 새로운 비밀번호는 2자 이상이 달라야 한다.

- 최근 15개의 비밀번호는 재사용할 수 없어야 한다.

- 5번 이상의 로그인 시도에서 실패하게 되면, 해당 계정을 사용할 수 없도록 한다.


PAM module: pam_cracklib.so

pam_cracklib.so 는 사전적인 단어 또는 특정 단어와 입력된 비밀번호간의 비교 검사를 할 수 있게 해 주는 모듈이다.


참고: 레드햇 리눅스의 pam_cracklib에 기본적으로 설정된 옵션은 없다.:


- 소문자의 최소개수(no credits)

- 대문자의 최소개수(no credits)

- 숫자의 최소개수(no credits)

- 이외 다른 문자의 최소개수(no credits)

위의 개수를 비밀번호의 최소 길이 x에 대한 개수이다.


위의 문제를 해결하기 위해서는 pam_cracklib.so 를 패치해야 한다. 

minlen은 비밀번호의 최소 자리수이며, 

lcredit, ucredit, dcredit, ocredit에 음수를 할당함으로써, 비밀번호에 대한 제한을 할 수 있다. 

다음에서 보여지는 것처럼 음수를 통해서 비밀번호 제한을 설정한다. 이 패치는 시스템에 설치된 pam_cracklib.so PAM에 적용된다. 패치에 관한 것은 여기에서 확인할 수 있다.


아래의 변수값들은 설치된 시스템에 패치를 적용하고 난 후에 음수값을 할당하면 작동할 것이다.

/lib/security/pam_cracklib.so minlen=8 비밀번호의 최소길이 8

/lib/security/pam_cracklib.so lcredit=-1 포함될 소문자의 최소개수

/lib/security/pam_cracklib.so ucredit=-1 포함될 대문자의 최소개수

/lib/security/pam_cracklib.so dcredit=-1 포함될 숫자의 최소개수

/lib/security/pam_cracklib.so ocredit=-1 포함될 다른 문자의 최소개수

/lib/security/pam_cracklib.so difok=2 이전의 비밀번호와 새로운 비밀번호간에 달라야 하는 문자수


PAM module: pam_unix.so

pam_unix.so 모듈은 UNIX의 표준 비밀번호 모듈이다.

/lib/security/pam_unix.so remember=15 재사용 할 수 없는 이전 비밀번호의 개수, 즉 이전의 비밀번호 15개를 기억하고 있으며, 새로운 비밀번호가 이것들 중의 어떤 것과도 일치하면 안된다.


PAM module: pam_tally2.so

ppam_tally.so 모듈은 접근을 시도한 횟수를 보관하며, 성공적으로 로그인 되었을 경우 초기화된다. 지정한 횟수 이상 로그인에 실패하게 되면, 해당 계정에 대해서 접근을 거부한다.

/lib/security/pam_tally2.so deny=5 재시도 가능 횟수


접속시도 회수 초과로 접근이 거부된 계정에 대해서 다시 접속 가능하게 하려면 다음과 같이 한다.

[root@linux ~]# faillog -u 사용자ID -r


모든 접속 실패 회수를 보려고 하면 다음과 같이 한다..

[root@linux ~]# faillog


/etc/pam.d/system-auth 파일

이 PAM 설정 파일은 일반적인 인증 양식에 따라 내용이 자동으로 생성된 파일이다. authconfig를 실행하게 되면, 현재 구성되어 있는 것은 자동으로 기본 인증 방식으로 변경된다. 만약 직접 변경한 값이 있다면, authconfig를 실행하지 말고, PAM설정을 인식하는 프로그램을 사용하거나 직접 편집하라. 이렇게 하는 것이 PAM 설정파일을 편집하는데 도움이 될 것이다.


비밀번호 제한을 위해서 /etc/pam.d/system-auth 파일의 PAM 모듈 매개변수들을 이용하여 아래와 같은 방식으로 설정할 수 있다.:


auth required /lib/security/pam_env.so

auth required /lib/security/pam_tally2.so onerr=fail no_magic_root

auth sufficient /lib/security/pam_unix.so likeauth nullok

auth required /lib/security/pam_deny.so


account required /lib/security/pam_unix.so

account required /lib/security/pam_tally2.so deny=5 no_magic_root reset


password required /lib/security/pam_cracklib.so retry=3 minlen=8 lcredit=-1

ucredit=-1 dcredit=-1 ocredit=-1 difok=2


password sufficient /lib/security/pam_unix.so nullok use_authtok md5 shadow remember=15

password required /lib/security/pam_deny.so


session required /lib/security/pam_limits.so

session required /lib/security/pam_unix.so

"root" 계정을 위한 "su" 명령 제한 설정


참고 : pam_wheel 모듈에 대해서 잘못된 부분이 있음!

RH 7.2, 7.3, 2.1AS 에 포함되어 있는 pam_wheel 모듈에 대한 문서는 잘못되었다. pam_wheel 모듈은 더 이상 su 명령을 통해서 root권한을 획득하기 위한 것으로만 사용되지 않는다. pam_wheel 모듈을 활성화시킨다면 wheel 그룹에 속한 모든 계정은 su명령으로 root 권한을 획득할 수 있고, root 가 아닌 다른 계정 권한도 획득할 수 있다. 이러한 문제로 인해서 root 권한으로의 변경을 제한하기 위해서 pam_wheel 모듈을 사용하지 않길 권한다. 그 이유는 일반 사용자 계정의 권한까지도 획득할 수 있기 때문이다.


이러한 문제를 해결하기 위해서는 아래의 설정을 참고하라.:


모든 사용자 계정에 su 명령을 사용하지 못하게 한다.

"root_members" 그룹의 소속 계정만 root 권한 획득을 허가한다.

오직 "root_members" 그룹의 소속 계정만 su 명령을 통해서 "root" 권한을 획득할 수 있다.

만약 이 그룹의 소속 계정이 아닌 누군가가 root 계정의 비밀번호를 알고 있다 하더라도, su 명령을 통해서 root 권한을 획득할 수 없다.


"root_members" 그룹을 만들어라.:

[root@linux ~]# groupadd root_members


"root_members" 그룹에 필요한 계정을 추가하라.: 예를 든다면

[root@linux ~]# usermod -G root_members 사용자_계정


/etc/pam.d/su 파일을 열어서 다음과 비슷하게 수정하라.:


auth sufficient /lib/security/pam_rootok.so

auth required /lib/security/pam_stack.so service=system-auth

auth sufficient /lib/security/pam_stack.so service=root-members

auth required /lib/security/pam_deny.so


account required /lib/security/pam_stack.so service=system-auth

password required /lib/security/pam_stack.so service=system-auth

session required /lib/security/pam_stack.so service=system-auth

session optional /lib/security/pam_xauth.so

/etc/pam.d/su 파일에서 참조할 /etc/pam.d/root-members 파일을 하나 만들고 다음과 비슷하게 작성하라.:


auth required /lib/security/pam_wheel.so use_uid group=root_members

auth required /lib/security/pam_listfile.so item=user sense=allow

onerr=fail file=/etc/membergroups/root

/etc/pam.d/root-members 파일에서 참조하는 /etc/membergroups/root 파일은, 단지 root라는 구성요소만 가진다.

우선 /etc/membergroups 라는 디렉토리를 만들고(다른 곳에다가 만들어도 된다.), 만든 경로를 /etc/pam.d/root-members 파일의 file 참조 부분에 적어주면 된다. 그 다음은 /etc/membergroups/root 파일에는 root 라는 구성요소만 있으면 된다.


"root_members" 그룹의 사용자만이 su 명령을 통해서 "root" 권한을 획득할 수 있는지 확인하라.


다른 사용자 계정을 위한 "su" 명령 제한

참고 : pam_wheel 모듈에 대해서 잘못된 부분이 있음!

RH 7.2, 7.3, 2.1AS 에 포함되어 있는 pam_wheel 모듈에 대한 문서는 잘못되었다. pam_wheel 모듈은 더 이상 su 명령을 통해서 root권한을 획득하기 위한 것으로만 사용되지 않는다. pam_wheel 모듈을 활성화시킨다면 wheel 그룹에 속한 모든 계정은 su명령으로 root 권한을 획득할 수 있고, root 가 아닌 다른 계정 권한도 획득할 수 있다. 이러한 문제로 인해서 root 권한으로의 변경을 제한하기 위해서 pam_wheel 모듈을 사용하지 않길 권한다. 그 이유는 일반 사용자 계정의 권한까지도 획득할 수 있기 때문이다.


이러한 문제를 해결하기 위해서는 아래의 설정을 참고하라.:


모든 사용자 계정에 su 명령을 사용하지 못하게 한다.

"oracle_members" 그룹의 소속 계정만 oracle 권한 획득을 허가한다.

오직 "oracle_members" 그룹의 소속 계정만 su 명령을 통해서 "oracle" 권한을 획득할 수 있다.

만약 이 그룹의 소속 계정이 아닌 누군가가 oracle 계정의 비밀번호를 알고 있다 하더라도, su 명령을 통해서 oracle 권한을 획득할 수 없다.


"oracle_members" 그룹과 "postgres_members" 그룹을 만들어라.:

[root@linux ~]# groupadd oracle_members

[root@linux ~]# groupadd postgres_members


"oracle_members" 그룹과 "postgres_members" 그룹에 필요한 계정을 추가하라.: 예를 든다면

[root@linux ~]# usermod -G oracle_members 사용자_계정

[root@linux ~]# usermod -G postgres_members 사용자_계정


아래의 예제처럼, /etc/pam.d/su 파일에 "root-members" 라인 아래쪽에 다음과 같이 한 줄을 추가한다.

/etc/pam.d/su 파일이 다음과 비슷하게 수정되었을 것이다.:


auth sufficient /lib/security/pam_rootok.so


auth required /lib/security/pam_stack.so service=system-auth

auth sufficient /lib/security/pam_stack.so service=root-members

auth sufficient /lib/security/pam_stack.so service=other-members

auth required /lib/security/pam_deny.so


account required /lib/security/pam_stack.so service=system-auth

password required /lib/security/pam_stack.so service=system-auth

session required /lib/security/pam_stack.so service=system-auth

session optional /lib/security/pam_xauth.so

/etc/pam.d/su 에서 참조할 /etc/pam.d/other-members 파일을 하나 만들고 다음과 비슷하게 작성하라.:


auth sufficient /lib/security/pam_stack.so service=oracle-members

auth sufficient /lib/security/pam_stack.so service=postgres-members

auth required /lib/security/pam_deny.so


/etc/pam.d/other-members 에서 참조할 /etc/pam.d/oracle-members 파일을 하나 만들고 다음과 비슷하게 작성하라.:

auth required /lib/security/pam_wheel.so use_uid group=oracle_members

auth required /lib/security/pam_listfile.so item=user sense=allow

onerr=fail file=/etc/membergroups/oracle


/etc/pam.d/other-members 에서 참조할 /etc/pam.d/postgres-members 파일을 하나 만들고 다음과 비슷하게 작성하라.:


auth required /lib/security/pam_wheel.so use_uid group=postgres_members

auth required /lib/security/pam_listfile.so item=user sense=allow

onerr=fail file=/etc/membergroups/postgres


/etc/pam.d/oracle-members 에서 참조하는 /etc/membergroups/oracle 파일에는 단지 oracle 이라는 구성요소만 가진다.

/etc/pam.d/postgres-members 에서 참조하는 /etc/membergroups/postgres 파일도 단지 postgres 라는 구성요소만 가진다.


"oracle_members" 그룹의 사용자만 su 명령을 통해서 "oracle" 계정의 권한을 획득하는지 확인하라. "postgres_members" 그룹의 사용자만이 su 명령을 통해서 "postgres" 계정의 권한을 획득하는지도 확인하라.


"login" 및 "gdm"(Graphical Login) 제한 설정

이 설정파일은 로그인 프로그램 또는 gdm(graphical login)에 사용자 인증의 기본 설정값을 알려준다.


PAM module: pam_access.so

이 모듈은 로그인명과 호스트명, IP주소 등 몇몇가지를 기반으로 하여 로그인 접속 제어를 로그데몬 방식으로 제공한다. 이것의 설정은 /etc/security/access.conf 파일에서 할 수 있다.

/lib/security/pam_access.so /etc/security/access.conf 파일을 이용하여 모든 계정의 로그인 매개변수 검사


/etc/pam.d/login 예제

/etc/pam.d/login 파일을 사용하는 방법에 대한 예제가 아래에 있다.:


auth required /lib/security/pam_securetty.so

auth required /lib/security/pam_stack.so service=system-auth

auth required /lib/security/pam_nologin.so

account required /lib/security/pam_access.so

account required /lib/security/pam_stack.so service=system-auth

password required /lib/security/pam_stack.so service=system-auth

session required /lib/security/pam_stack.so service=system-auth

session optional /lib/security/pam_console.so


"login", "gdm"(Graphical Login), SSH, 등등을 위한 로그인 제한

아래와 같이 설정하기 위해서는 PAM 설정파일에 pam_access 모듈이 설정되어 있어야 된다. /etc/security/access.conf 에 설정되어 있는 ssh 접속에 대해서 즉시 적용되길 원한다면, /etc/pam.d/sshd 파일에 /lib/security/pam_access.so 에 대한 설정이 있어야 한다.


PAM 설정 파일의 마지막 부분에 pam_access.so 를 설정하길 권장한다.:

/etc/pam.d/sshd

/etc/pam.d/login

/etc/pam.d/gdm


/etc/security/access.conf 예제

일반적으로 사용자 계정은 "users" 그룹에 포함되게 된다. 공유 계정 또는 시스템 계정은 "users" 그룹에 포함되어서는 안된다. 시스템이 있다고 가정한다면, 우리는 직접적인 로그인은 "users" 계정에 포함된 계정(예를 들면 모든 사용자 계정)만 작동하게 규정할 수 있다. 사용자 계정이 아닌 계정 즉, "users" 그룹에 포함되지 않은 계정(예를 들면 공유 계정과 시스템 계정)에 대한 직접적인 로그인은 불가능 해야 한다.

그 이유는 공유계정으로 로그인 한 사용자에 대한 역추적이 불가능하기 때문이다. 만약 공유 계정에 대해서 직접적인 로그인을 불가능하게 하고, 공유 계정에 su 명령을 허락한다면 공유 계정에서 su 명령을 통해서 전환한 사용자에 대해서 역추적을 할 수 있다.


위와 같이 로그인을 제한하기 위해서는 다음과 같은 라인을 추가해야 한다.:


-:ALL EXCEPT users :ALL

참고 : 위의 경우, /etc/passwd 파일에 "users"라는 사용자 계정이 없어야만 제대로 작동한다.