블로그 이미지
22Hz 22Hz

카테고리

분류 전체보기 (109)
모의해킹 침해대응 전문가 과정 (99)
리눅스 설정 (10)
Total
Today
Yesterday

달력

« » 2025.7
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

공지사항

태그목록

최근에 올라온 글

1.3 계정 잠금 임계값 설정

 

점검 분류 항목: 계정 관리

세부 점검 항목: 계정 잠금 임계값 설정

대상: 리눅스

위험도:

관련 코드: U-03

 

(1) 취약점 개요

침입자에 의한 패스워드 *무작위 대입 공격(Brute Force Attack)이나 패스워드 추측 공격(Password Guessing) 발생 시 암호입력 실패 횟수를 적정하게 제한함으로써 자동공격을 차단하고 공격 시간을 지체시켜 패스워드 유출 위험을 줄일 수 있음.

무작위 대입 공격(Brute Force Attack): 컴퓨터로 암호를 해독하기 위해 가능한 모든 키를 하나하나 추론해 보는 시도를 말함.

 

(2) 판단기준

양호: 계정 잠금 임계값이 5 이하의 값으로 설정되어 있는 경우

취약: 계정 잠금 임계값이 설정되어 있지 않거나, 5 이하의 값으로 설정되지 않은 경우

 

(3) 조치방법

계정 잠금 임계값을 5 이하로 설정

 

(4) 보안 설정 방법

# cat /etc/pam.d/system-auth

auth required /lib/security/pam_tally.so deny=5 unlock_time=120 no_magic_root

account required /lib/security/pam_tally.so no_magic_root reset

 

no_magic_root : root 사용자에게 패스워드 잠금 설정을 적용하지 않음

deny=5 : 5회 입력 실패시 패스워드 잠금

unlock_time : 계정 잠김 후 마지막 계정 실패 시간부터 설정된 시간이 지나면 자동 계정

잠김 해제(단위 : )

reset : 접속 시도 성공 시 실패한 횟수 초기화

 

(5) 조치시 영향

Trusted Mode로 전환 시 파일시스템 구조가 변경되어 운영 중인 서비스에 문제가 발생할 수 있으므로 충분한 테스트를 거친 후 Trusted Mode로의 전환이 필요함.

 

 

(고객에게 설명)

무작위 대입법이나 패스워드 추측 공격에 대해서 자동화된 툴을 통해 공격하는 방법의 위험을 줄일 수 있다.

xhydra

 

 

[실습] 계정 잠금 임계값 설정

-> 실습은 뒤쪽에서 한번에 다룬다.

 

 

 

 

 

 

 

1.4 패스워드 파일 보호

 

점검 분류 항목: 계정 관리

세부 점검 항목: 패스워드 파일 보호

대상: 리눅스

위험도:

관련 코드: U-04

 

(1) 취약점 개요

패스워드 정보를 평문으로 저장하는 경우 정보 유출 피해가 발생할 수 있으므로 패스워드를 암호화하여 보호하여야 함. 쉐도우 패스워드를 사용하여 “/etc/shadow”파일에 암호화된 패스워드가 저장되도록 하고 특별 권한이 있는 사용자들만 읽을 수 있도록 제한함.

 

(2) 판단기준

양호: 쉐도우 패스워드를 사용하거나, 패스워드를 암호화하여 저장하는 경우

취약: 쉐도우 패스워드를 사용하지 않고, 패스워드를 암호화하여 저장하지 않는 경우

 

(3) 조치방법

패스워드 암호화 저장관리 설정 적용

 

(4) 보안 설정 방법

/shadow 파일 존재 확인 (일반적으로 /etc 디렉터리 내 존재)

# ls /etc

/etc/passwd 파일 내 두 번째 필드가 "x" 표시되는지 확인

# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

 

(5) 조치시 영향

Trusted Mode로 전환 시 파일시스템 구조가 변경되어 운영 중인 서비스에 문제가 발생할 수 있으므로 충분한 테스트를 거친 후 Trusted Mode로의 전환이 필요함.

 

 

(고객에게 설명)

/etc/passwd 파일 체계를 사용하는 것은 보안상 위험하다. 따라서, /etc/passwd, /etc/shadow 파일을 사용하는 체계를 사용해야 한다.

 

 

[실습] pwconv/pwunconv 명령어 실습

 

 

pwconv/pwunconv 명령어

 

 

(linux200)

 

기본 체계에 대한 확인

# ls -l /etc/passwd /etc/shadow

-rw-r--r-- 1 root root 2.2K Apr 4 17:03 /etc/passwd

-r-------- 1 root root 1.7K May 20 15:47 /etc/shadow

 

pwconv/pwunconv 명령어 사용법 확인

 

/etc/passwd 체계 ------- pwconv -------> /etc/passwd, /etc/shadow 체계

<------ pwunconv --------

 

# man pwconv

NAME

pwconv, pwunconv, grpconv, grpunconv - convert to and from

shadow passwords and groups

 

SYNOPSIS

pwconv

 

pwunconv

 

grpconv

 

grpunconv

 

DESCRIPTION

pwconv creates shadow from passwd and an optionally existing

shadow.

 

pwunconv creates passwd from passwd and shadow and then

removes shadow.

 

grpconv creates gshadow from group and an optionally existing

gshadow.

 

grpunconv creates group from group and gshadow and then

removes gshadow.

 

These four programs all operate on the normal and shadow

password and group files: /etc/passwd, /etc/group,

/etc/shadow, and /etc/gshadow.

 

pwunconv 명령어 수행

 

/etc/passwd, /etc/shadow 체계 ------- pwunconv -------> /etc/passwd 체계

 

# pwunconv

# ls -l /etc/passwd /etc/shadow

/bin/ls: /etc/shadow: No such file or directory

-rw-r--r-- 1 root root 2.6K May 23 09:55 /etc/passwd

 

[참고] KaliLinux 에서

# unshadow /etc/passwd /etc/shadow > pass.txt

# john pass.txt

 

# cat /etc/passwd

root:$1$fXOTsxsm$PyW7NW8JiqdK/g6VIsYyw.:0:0:root:/root:/bin/bash

bin:*:1:1:bin:/bin:/sbin/nologin

..... (중략) .....

fedora:$1$Mm1TUhCG$mbQuE/QiNG.Oiv5lS.rhS0:500:500:fedora:/home/fedora:/bin/bash

user01:$1$n0iV.mvR$EaAXiIzf0WHsqi1RzJQoN1:501:501::/home/user01:/bin/bash

user02:$1$IdDBpP7m$3lcnVu91My.MCzuLnRttC0:502:502::/home/user02:/bin/bash

mail01:$1$mTDtzn7y$fCD0FiyorKPCNQVZhk/1w.:503:503::/home/mail01:/bin/bash

mail02:$1$kr35sIHE$NAsWBfyf3hd2QcjsZoPri/:504:504::/home/mail02:/bin/bash

team01:$1$vBIGm46W$clCimt0Uc5eeSTXCsuJ5B/:505:505::/home/team01:/bin/bash

team02:$1$UcVinomG$4JTJi/ZZzapXZY1MnIppO/:506:506::/home/team02:/bin/bash

user100:$1$r8BOMgwk$EQi45SM9F.rXg2hS19hUY0:507:507::/home/user100:/bin/bash

user03:$1$kPsQBwAg$D6KhS58VMwLyePyjPHZZG0:508:508::/home/user03:/bin/bash

 

pwconv 명령어 수행

 

/etc/passwd 체계 ------- pwconv -------> /etc/passwd, /etc/shadow 체계

 

# pwconv

# ls -l /etc/passwd /etc/shadow

-rw-r--r-- 1 root root 2.2K May 23 10:00 /etc/passwd

-r-------- 1 root root 1.7K May 23 10:00 /etc/shadow

 

 

 

 

 

 

 

(보안정책)

리눅스의 기본 체계를 쓸것을 권장한다.

 

 

(스크립트 제작)

# [ -f /etc/passwd -a -f /etc/shadow ] && echo "OK" || echo "WARN"

 

 

 

 

(고객에게 설명)

리눅스 운영체제에서는 사용자 이름이 아닌 UID를 통해 권한 할당이 된다. 따라서 user01 사용자 이름을 가지고 있지만 UID 번호가 0으로 되어 있다면, 관리자와 동인할 기능을 갖는다.

간단한 테스트# usermod -u 0 -o user01# telnet localhost user01 사용자로 로그인$ id# usermod -u 500 user01

 

[실습] user01 사용자를 추가하고 uid 번호를 0으로 설정하여 권한 상승 실습

 

root 사용자 이외의 UID '0' 사용자 확인

 

 

 

기본 체계에 대한 확인

 

[참고] 리눅스 UID 번호 체계

0 ~ 499 : System Account (EX: root = 0)

500 ~ 60000 : End User (EX: fedora = 500)

60001 ~ 65535 : End User with egular purpose (EX: nobody)

 

# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

news:x:9:13:news:/etc/news:

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

..... (중략) ....

fedora:x:500:500:fedora:/home/fedora:/bin/bash

user01:x:501:501::/home/user01:/bin/bash

user02:x:502:502::/home/user02:/bin/bash

mail01:x:503:503::/home/mail01:/bin/bash

mail02:x:504:504::/home/mail02:/bin/bash

team01:x:505:505::/home/team01:/bin/bash

team02:x:506:506::/home/team02:/bin/bash

user100:x:507:507::/home/user100:/bin/bash

user03:x:508:508::/home/user03:/bin/bash

 

usermod 명령어의 사용법 확인

# man usermod

-o, --non-unique

When used with the -u option, this option allows to change

the user ID to a non-unique value.

 

-u, --uid UID

The numerical value of the user’s ID. This value must be

unique, unless the -o option is used. The value must be

non-negative. Values between 0 and 999 are typically

reserved for system accounts. Any files which the user owns

and which are located in the directory tree rooted at the

user’s home directory will have the file user ID changed

automatically. Files outside of the user’s home directory

must be altered manually.

 

# egrep '(user01|user02)' /etc/passwd

user01:x:501:501::/home/user01:/bin/bash

user02:x:502:502::/home/user02:/bin/bash

 

# usermod -u 0 user01

usermod: uid 0 is not unique

 

# usermod -u 0 -o user01

# grep --color user01 /etc/passwd

user01:x:0:501::/home/user01:/bin/bash

 

# telnet localhost

user01 사용자로 로그인

 

# id

uid=0(root) gid=501(user01) groups=501(user01)

 

# cat /etc/shadow

-> 파일 내용 확인 가능

 

# exit

# usermod -u 501 user01

# grep user01 /etc/passwd

-> uid 번호 복원

 

 

 

 

 

(보안 정책)

중복된 UID 번호를 쓰는 사용자가 존재하는지와 UID 번호가 0으로 설정된 사용자 확인

 

 

(스크립트 제작)

# NUM=`awk -F: '{print $3}' /etc/passwd | sort -n | uniq -d | wc -l`

# if [ $NUM -gt 0 ] ; then

echo "WARN"

else

echo "OK"

fi

 

 

1.6 root 계정 su 제한

 

점검 분류 항목: 계정 관리

세부 점검 항목: root 계정 su 제한

대상: 리눅스

위험도:

관련 코드: U-06

 

(1) 취약점 개요

권한이 없는 일반 사용자가 su 명령을 사용하여 로그인을 시도하고 패스워드 무작위 대입 공격(Brute Force Attack)이나 패스워드 추측 공격(Password Guessing)을 통해 root 권한을 획득할 수 있음. su 명령어 사용이 허용된 사용자만 root 계정으로 접속할 수 있도록 함.

 

(2) 판단기준

양호: su 명령어를 특정 그룹에 속한 사용자만 사용하도록 제한되어 있는 경우

취약: su 명령어를 모든 사용자가 사용하도록 설정되어 있는 경우

 

(3) 조치방법

일반 사용자의 su 명령 사용 제한

1. Group 생성(생성할 그룹 요청, 일반적으로 wheel 사용)

2. su 명령어의 그룹을 요청받은 그룹으로 변경

3. su 명령어의 권한 변경(4750)

4. su 명령어 사용이 필요한 계정을 새로 생성한 그룹에 추가(추가할 계정 요청)

 

LINUX의 경우, *PAM(Pluggable Authentication Module)을 이용한 설정 가능

*PAM(Pluggable Authentication Module): 사용자를 인증하고 그 사용자의 서비스에 대한

액세스를 제어하는 모듈화 된 방법을 말하며, PAM은 관리자가 응용프로그램들의 사용자 인증

방법을 선택할 수 있도록 해줌

 

(4) 보안 설정 방법

1. “wheel” 그룹(su 명령어 사용 그룹) 및 그룹 내 구성원 존재 여부 확인

# cat /etc/group

wheel:x:10:root,admin

2. 허용 그룹(su 명령어 사용 그룹) 설정 여부 확인

# cat /etc/pam.d/su

auth required /lib/security/pam_wheel.so debug group=wheel 또는,

auth required /lib/security/$ISA/pam_wheel.so use_uid

 

LINUX PAM 모듈을 이용한 설정 방법

1. “/etc/pam.d/su” 파일을 아래와 같이 설정(주석제거)

auth sufficient /lib/security/pam_rootok.so

auth required /lib/security/pam_wheel.so debug group=wheel 또는,

auth sufficient /lib/security/$ISA/pam_rootok.so

auth required /lib/security/$ISA/pam_wheel.so use_uid

2. wheel 그룹에 su 명령어를 사용할 사용자 추가

# usermod -G wheel <user_name>

또는, 직접 “/etc/group” 파일을 수정하여 필요한 계정 추가

wheel:x:10: -> wheel:x:10:root,admin

 

(5) 조치시 영향

그룹에 추가된 계정들은 모든 Session 종료 후 재로그인 시 su 명령어 사용 가능

 

(고객에게 설명)

sucrack 툴에 대한 설명(EX: KaliLinux)

 

[실습] wheel 그룹에 대한 실습(/var/log/secure)

/etc/pam.d/su 파일

 

su 명령어 사용에 대한 제어

 

 

 

# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

 

[참고] sucrack (EX: KaliLinux 2.X)

PAM(Plugable Athentication Module)

/etc/pam.d/*

 

# mkdir -p /backup

# cp -p /etc/pam.d/su /backup

# vi /etc/pam.d/su

#%PAM-1.0

auth sufficient /lib/security/pam_rootok.so

auth required /lib/security/pam_wheel.so debug group=wheel <---- 라인 추가

# Uncomment the following line to implicitly trust users in the "wheel" group.

#auth sufficient /lib/security/pam_wheel.so trust use_uid

# Uncomment the following line to require a user to be in the "wheel" group.

#auth required /lib/security/pam_wheel.so use_uid

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

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

운영체제 버전에 맞게 라인 추가

(32bit OS) "auth required /lib/security/pam_wheel.so debug group=wheel"

(64bit OS) "auth required /lib64/security/pam_wheel.so debug group=wheel"

 

# usermod -G wheel user01 /* -G : Secondary Group 지정 */

# id -a user01

uid=506(user01) gid=506(user01) groups=506(user01),10(wheel)

 

# id -a user02

uid=507(user02) gid=507(user02) groups=507(user02)

 

[TERM2] # tail -f /var/log/secure

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

Sep 16 10:03:29 linux249 login: pam_unix(remote:session): session opened for user user01 by LOGIN(uid=0)

Sep 16 10:03:49 linux249 su: pam_wheel(su-l:auth): Ignoring access request 'user01' for 'root'

Sep 16 10:03:51 linux249 su: pam_unix(su-l:session): session opened for user root by user01(uid=506)

Sep 16 10:04:01 linux249 su: pam_unix(su-l:session): session closed for user root

Sep 16 10:04:07 linux249 login: pam_unix(remote:session): session opened for user user02 by LOGIN(uid=0)

Sep 16 10:04:13 linux249 su: pam_wheel(su-l:auth): Access denied to 'user02' for 'root'

Sep 16 10:04:38 linux249 login: pam_unix(remote:session): session closed for user user02

Sep 16 10:05:07 linux249 login: pam_unix(remote:session): session closed for user user01

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

 

# telnet localhost

user01 사용자로 로그인

 

$ su -

Password: (soldesk1.)

 

# exit

$ exit

 

 

# telnet localhost

user02 사용자로 로그인

 

$ su -

Password: (soldesk1.)

su: incorrect password

 

$ exit

#

 

(복원) # vi /etc/pam.d/su

-> 이전에 새로 추가된 라인에 주석 처리(#)

 


 

(정리) 보안 정책

su 명령어를 통해 스위칭할수 있는 사용자 그룹(wheel)을 설정한다.-> /etc/pam.d/su-> usermod -G wheel user01

sudo 명령어를 사용할 수 있는 사용자/그룹 지정, 명령어의 집합의 지정이 필요하다.-> /etc/sudoers

 

(스크립트 제작)

# grep pam_wheel.so /etc/pam.d/su

#auth required /lib/security/pam_wheel.so debug group=wheel

#auth sufficient pam_wheel.so trust use_uid

#auth required pam_wheel.so use_uid

 

# NUM=`grep pam_wheel.so /etc/pam.d/su | grep -v '^#' | wc -l`

# if [ $NUM -gt 0 ] ; then

echo "OK"

else

echo "WARN"

fi

 

 

 

 

 

PAM (Pluggable Authentication Modules)

 

 

 

 

 

(1) PAM (Pluggable Authentication Modules, 착탈형 인증 모듈) 이란?

 

사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 제어하는 모듈화된 방법을 말한다. PAM은 관리자가 응용프로그램들의 사용자 인증 방법을 선택할 수 있도록 해 준다. 즉 필요한 공유라이브러리의 묶음을 제공하여 PAM을 사용하는 응용프로그램을 재컴파일없이 인증 방법을 변경할 수 있다.

 

 

(2) PAM 목적과 동작

 

"리눅스-PAM프로젝트의 목적은 안전하고 적합한 인증방법의 개발과 소프트웨어에게 부여한 특권의 개발을 분리하는 것이다"라고 되어 있다. 이것은 사용자가 인증되어야 한다는 요청하기 위해 어떤 응용프로그램이 사용할 수 있는 함수의 라이브러리를 제공함으로써 가능하다. PAM 라이브러리는 /etc/pam.d(또는 /etc/pam.conf)에서 각 시스템에 맞게 설정하여, 각 시스템에서 사용가능한 인증 모듈을 통해 사용자의 인증 요구를 처리한다. 모듈 자체는 /lib/security(또는 /usr/lib/security)에 위치하고 동적으로 로드가능한 오프젝트 파일의 형태를 갖는다.

 

 

(3) PAM 구성 파일

 

/etc/pam.d/<PAM 파일>(또는 /etc/pam.conf)

 

 

(4) PAM 구성 파일의 문법

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

type control module-path module-arguments

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

 

type(종류)

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

 

종류

설명

account

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

auth

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

password

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

session

사용자가 인증받기 전에 또는/그리고 후에 되어야 할 것이다. 이것은 사용자 홈 디렉토리를 마운팅/언마우팅하는 것과 로그인/로그아웃 그리고 사용자에게 제공하는 서비스를 제한/제공하는 것과 같은 것을 포함할 수 있다.

 

control(제어)

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

 

종류

설명

requisite

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

required

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

sufficient

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

optional

이 모듈이 성공 또는 실패하는 지는 그 모듈이 서비스에 대한 형식에 대한 유일한 모듈일 경우에 중요하다. 보통 PAM은 모듈의 성공/실패 판단시에 이런 모듈을 무시한다. 그러나 이전/이후의 모듈들이 명확한 성공/실패가 없다면 이 모듈이 응용그램에게 주는 결과로 결정짓는다.

 

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

 

 

module-path(모듈 경로)

 

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

 

# which passwd

/usr/bin/passwd

 

# ldd /usr/bin/passwd

linux-gate.so.1 => (0x00212000)

libuser.so.1 => /usr/lib/libuser.so.1 (0x0063c000)

libcrypt.so.1 => /lib/libcrypt.so.1 (0x0577b000)

libgobject-2.0.so.0 => /lib/libgobject-2.0.so.0 (0x0085c000)

libgmodule-2.0.so.0 => /lib/libgmodule-2.0.so.0 (0x00931000)

libdl.so.2 => /lib/libdl.so.2 (0x00667000)

libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0x006aa000)

libpopt.so.0 => /usr/lib/libpopt.so.0 (0x051fa000)

libpam_misc.so.0 => /lib/libpam_misc.so.0 (0x00936000)

libaudit.so.0 => /lib/libaudit.so.0 (0x00451000)

libselinux.so.1 => /lib/libselinux.so.1 (0x00233000)

libc.so.6 => /lib/libc.so.6 (0x004de000)

libpam.so.0 => /lib/libpam.so.0 (0x052b6000)

librt.so.1 => /lib/librt.so.1 (0x0069f000)

/lib/ld-linux.so.2 (0x004bf000)

libsepol.so.1 => /lib/libsepol.so.1 (0x0024d000)

libpthread.so.0 => /lib/libpthread.so.0 (0x00683000)

 

module-arguments(모듈 인수)

 

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

 

 

(5) 주요 PAM 파일

 

(CentOS 5.X)

 

# cd /etc/pam.d

# ls

atd passwd system-auth-ac

authconfig pirut system-cdinstall-helper

authconfig-gtk pm-hibernate system-config-authentication

authconfig-tui pm-powersave system-config-date

chfn pm-suspend system-config-display

chsh pm-suspend-hybrid system-config-httpd

config-util poweroff system-config-kdump

cpufreq-selector ppp system-config-keyboard

crond pup system-config-language

cups reboot system-config-lvm

dateconfig remote system-config-netboot

dovecot run_init system-config-network

eject runuser system-config-network-cmd

ekshell runuser-l system-config-nfs

gdm sabayon system-config-printer

gdm-autologin samba system-config-rootpassword

gdmsetup seaudit system-config-samba

gnome-screensaver serviceconf system-config-securitylevel

gnome-system-log setup system-config-selinux

gssftp smtp system-config-services

halt smtp.sendmail system-config-soundcard

kbdrate squid system-config-time

kshell sshd system-config-users

ksu su system-install-packages

login su-l vmtoolsd

neat sudo vsftpd

newrole sudo-i wireshark

other system-auth xserver

 

/etc/pam.d/login

슈퍼 유저로 로그인할 수 있는 사용자 인증과 관련된 파일이다.

 

# cat login

#%PAM-1.0

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

/* pam_securetty.so 모듈이 지정해 놓은 보안 규칙을 만족해야만 로그인이 허용된다는 설정이다. 이 모듈은 /etc/securetty 파일에서 지정되어 있는 tty에서 요청한 슈퍼유저만 로그인을 허용한다. */

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

 

/etc/pam.d/other

PAM에서 별도로 지정하지 않은 서비스에 대한 인증을 위한 참조하는 파일이다.

 

# cat other

#%PAM-1.0

auth required pam_deny.so

account required pam_deny.so

password required pam_deny.so

session required pam_deny.so

/* 지정되지 않은 서비스가 4개의 구성타입 중 어떤 곳에 접근을 시도하더라도 PAM은 인증을 거부한다. (pam_deny.so 모듈이 담당한다.) */

 

 

 

 

 

(6) 주요 PAM 모듈

 

# cd /lib/security

# ls

pam_access.so pam_krb5 pam_pkcs11.so pam_time.so

pam_ccreds.so pam_krb5.so pam_postgresok.so pam_timestamp.so

pam_chroot.so pam_krb5afs.so pam_pwhistory.so pam_tty_audit.so

pam_console.so pam_lastlog.so pam_rhosts.so pam_umask.so

pam_cracklib.so pam_ldap.so pam_rhosts_auth.so pam_unix.so

pam_debug.so pam_limits.so pam_rootok.so pam_unix_acct.so

pam_deny.so pam_listfile.so pam_rps.so pam_unix_auth.so

pam_echo.so pam_localuser.so pam_securetty.so pam_unix_passwd.so

pam_env.so pam_loginuid.so pam_selinux.so pam_unix_session.so

pam_exec.so pam_mail.so pam_shells.so pam_userdb.so

pam_faildelay.so pam_mkhomedir.so pam_smb_auth.so pam_warn.so

pam_filter pam_motd.so pam_smbpass.so pam_wheel.so

pam_filter.so pam_namespace.so pam_stack.so pam_winbind.so

pam_ftp.so pam_nologin.so pam_stress.so pam_xauth.so

pam_group.so pam_oddjob_mkhomedir.so pam_succeed_if.so

pam_issue.so pam_passwdqc.so pam_tally.so

pam_keyinit.so pam_permit.so pam_tally2.so

 

/lib/security/pam_securetty.so 모듈

 

# man pam_securetty

NAME

pam_securetty - Limit root login to special devices

 

SYNOPSIS

pam_securetty.so [debug]

 

DESCRIPTION

pam_securetty is a PAM module that allows root logins only if the

user is logging in on a "secure" tty, as defined by the listing in

/etc/securetty. pam_securetty also checks to make sure that

/etc/securetty is a plain file and not world writable.

 

This module has no effect on non-root users and requires that the

application fills in the PAM_TTY item correctly.

 

For canonical usage, should be listed as a required authentication

method before any sufficient authentication methods.

 

EXAMPLES

auth required pam_securetty.so

auth required pam_unix.so

 

표준 UNIX securetty 검사해서 /etc/securetty 파일에 기록된 내용과 비교하는데 root 계정인 경우에만 확인한다. 그 외의 다른 사용자에 대해서는 항상 인증이 성공한 것으로 처리한다. 다른 sufficient 인증 방법보다 앞서 require 인증방법으로 등록하는 것이 표준 사용방식이다.

 

(사용예)

# find /etc/pam.d -type f -exec grep -l securetty {} \;

/etc/pam.d/ekshell

/etc/pam.d/kshell

/etc/pam.d/login

/etc/pam.d/remote

 

# cat /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

 

 

/lib/security/pam_listfile.so 모듈

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

 

# man pam_listfile

NAME

pam_listfile - deny or allow services based on an arbitrary file

 

SYNOPSIS

pam_listfile.so item=[tty|user|rhost|ruser|group|shell]

sense=[allow|deny] file=/path/filename

onerr=[succeed|fail] [apply=[user|@group]]

 

DESCRIPTION

pam_listfile is a PAM module which provides a way to deny or allow

services based on an arbitrary file.

 

The module gets the item of the type specified -- user specifies

the username, PAM_USER; tty specifies the name of the terminal over

which the request has been made, PAM_TTY; rhost specifies the name

of the remote host (if any) from which the request was made,

PAM_RHOST; and ruser specifies the name of the remote user (if

available) who made the request, PAM_RUSER -- and looks for an

instance of that item in the file=filename. filename contains one

line per item listed. If the item is found, then if sense=allow,

PAM_SUCCESS is returned, causing the authorization request to

succeed; else if sense=deny, PAM_AUTH_ERR is returned, causing the

authorization request to fail.

 

If an error is encountered (for instance, if filename does not

exist, or a poorly-constructed argument is encountered), then if

onerr=succeed, PAM_SUCCESS is returned, otherwise if onerr=fail,

PAM_AUTH_ERR or PAM_SERVICE_ERR (as appropriate) will be returned.

 

An additional argument, apply=, can be used to restrict the

application of the above to a specific user (apply=username) or a

given group (apply=@groupname). This added restriction is only

meaningful when used with the tty, rhost and shell items.

 

Besides this last one, all arguments should be specified; do not

count on any default behavior.

 

No credentials are awarded by this module.

 

OPTIONS

item=[tty|user|rhost|ruser|group|shell]

What is listed in the file and should be checked for.

 

sense=[allow|deny]

Action to take if found in file, if the item is NOT found in the

file, then the opposite action is requested.

 

file=/path/filename

File containing one item per line. The file needs to be a plain

file and not world writeable.

 

onerr=[succeed|fail]

What to do if something weird happens like being unable to open

the file.

 

apply=[user|@group]

Restrict the user class for which the restriction apply. Note

that with item=[user|ruser|group] this oes not make sense, but

for item=[tty|rhost|shell] it have a meaning.

 

EXAMPLES

Classic 'ftpusers' authentication can be implemented with this

entry in /etc/pam.d/ftpd:

 

#

# deny ftp-access to users listed in the /etc/ftpusers file

#

auth required pam_listfile.so \

onerr=succeed item=user sense=deny file=/etc/ftpusers

 

Note, users listed in /etc/ftpusers file are (counterintuitively)

not allowed access to the ftp service.

 

To allow login access only for certain users, you can use a

/etc/pam.d/login entry like this:

 

#

# permit login to users listed in /etc/loginusers

#

auth required pam_listfile.so \

onerr=fail item=user sense=allow file=/etc/loginusers

 

For this example to work, all users who are allowed to use the

login service should be listed in the file /etc/loginusers. Unless

you are explicitly trying to lock out root, make sure that when you

do this, you leave a way for root to log in, either by listing root

in /etc/loginusers, or by listing a user who is able to su to the

 

모듈 인자

onerr=[succeed|fail]onerr=suceed 이면 PAM_SUCCESS를 리턴하고, onerr=fail이면 PAM_AUTH_ERR 또는 PAM_SERVICE_ERR이 리턴된다. 보통 sense와 반대로 적는다.

file=filename지정한 파일을 읽는다. 한줄에 한 아이템만 적는다.

sense=allow|denyallow는 특정한 아이템이 벌견되면 PAM_SUCCESS가 리턴되고 권한요구는 성공한다. 값이 deny이면 PAM_AUTH_ERR이 리턴되고 권한요구는 실패한다.

apply=user|@group특정사용자 또는 주어진 그룹으로 적용을 제한하는데 사용한다. 이것은 tty, rhosts, shell 아이템과 함께 사용될 때만 의미가 있는 제한이다. 생성시에 이 모듈인자를 제외하고는 모듈인자는 필수적이다.

 

(사용예)

# cat /etc/pam.d/ftp

#%PAM-1.0

auth sufficient pam_rootok.so

#auth required /lib/security/pam_wheel.so debug group=wheel

# 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

 

위와 같은 식으로 다음과 같은 모듈을 분석하여 본다.

/lib/security/ftp 모듈

/lib/security/nologin.so 모듈

/lib/security/pam_deny.so 모듈

/lib/security/pam_cracklib.so 모듈

/lib/security/pam_wheel.so 모듈

/lib/security/pam_rootok.so 모듈

 

(정리)

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

# cd /etc/pam.d

# ls

passwd

 

# cat passwd

#%PAM-1.0

auth include system-auth

account include system-auth

password include system-auth

 

# cat system-auth

#%PAM-1.0

# This file is auto-generated.

# User changes will be destroyed the next time authconfig is run.

auth required pam_env.so

auth sufficient pam_unix.so nullok try_first_pass

auth requisite pam_succeed_if.so uid >= 500 quiet

auth required pam_deny.so

 

account required pam_unix.so

account sufficient pam_succeed_if.so uid < 500 quiet

account required pam_permit.so

 

password requisite pam_cracklib.so try_first_pass retry=3

password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok

password required pam_deny.so

 

session optional pam_keyinit.so revoke

session required pam_limits.so

session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

session required pam_unix.so

 

# man pam_env

NAME

pam_env - PAM module to set/unset environment variables

 

SYNOPSIS

pam_env.so [debug] [conffile=conf-file] [envfile=env-file]

[readenv=0|1]

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

 

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

# cd /lib/security

# ls *env*

pam_env.so

 

# find /etc/pam.d -type f -exec grep -l pam_env.so {} \;

/etc/pam.d/gdm

/etc/pam.d/ekshell

/etc/pam.d/crond

/etc/pam.d/kshell

/etc/pam.d/gdm-autologin

/etc/pam.d/atd

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

 

# cat /etc/pam.d/crond

#

# The PAM configuration file for the cron daemon

#

#

auth sufficient pam_env.so

auth required pam_rootok.so

auth include system-auth

account required pam_access.so

account include system-auth

session required pam_loginuid.so

session include system-auth

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

 

 

(7) PAM 응용 예제

 

[EX1] 사용자 패스워드 길이 제한하기

리눅스에서 패스워드 기본설정과 관련된 파일이 /etc/login.defs이다. 이 파일에서 패스워드의 길이는 최소 5자로 설정하고 있다. 이 파일에서 설정해도 되지만 PAM을 이용하여 패스워드의 길이를 설정할 수도 있다. 기본 설정 파일은 /etc/pam.d/passwd 파일이다.

 

# cat /etc/pam.d/passwd

#%PAM-1.0

auth include system-auth

account include system-auth

password include system-auth

 

# cat /etc/pam.d/system-auth

is file is auto-generated.

# User changes will be destroyed the next time authconfig is run.

auth required pam_env.so

auth sufficient pam_unix.so nullok try_first_pass

auth requisite pam_succeed_if.so uid >= 500 quiet

auth required pam_deny.so

 

account required pam_unix.so

account sufficient pam_succeed_if.so uid < 500 quiet

account required pam_permit.so

 

password requisite pam_cracklib.so try_first_pass retry=3

password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok

password required pam_deny.so

 

session optional pam_keyinit.so revoke

session required pam_limits.so

session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

session required pam_unix.so

 

# vi /etc/pam.d/passwd

#%PAM-1.0

[수정전]

auth include system-auth

account include system-auth

password include system-auth

[수정후]

auth include system-auth

account include system-auth

#password include system-auth

password required pam_cracklib.so retry=3 minlen=12 type=LINUX

password sufficient pam_unix.so nullok use_authok md5 shadow

password required pam_deny.so

-> /etc/pam.d/system-auth 파일의 설정을 따르지 않고 새로운 모듈로 설정하였다.

 

# vi /etc/pam.d/system-auth

#%PAM-1.0

# This file is auto-generated.

# User changes will be destroyed the next time authconfig is run.

auth required pam_env.so

auth sufficient pam_unix.so nullok try_first_pass

auth requisite pam_succeed_if.so uid >= 500 quiet

auth required pam_deny.so

 

account required pam_unix.so

account sufficient pam_succeed_if.so uid < 500 quiet

account required pam_permit.so

 

#password requisite pam_cracklib.so try_first_pass retry=3

#password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok

#password required pam_deny.so

 

session optional pam_keyinit.so revoke

session required pam_limits.so

session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

session required pam_unix.so

 

# telnet localhost

user02 사용자로 로그인

 

$ passwd

Changing password for user user02.

Changing password for user02

(current) UNIX password: (user02)

New LINUX password: (soldesksecurity1.)

Retype new LINUX password: (soldesksecurity1.)

Enter new UNIX password: (soldesksecurity1.)

Retype new UNIX password: (soldesksecurity1.)

passwd: all authentication tokens updated successfully.

-> 현재 암호를 물어 보고 맞추면, 새로운 암호를 3번 물어 본다.(retry=3)

-> 암호 재입력(retry)3번하라고 정의해서 그렇다.

 

$ exit

# passwd user02

Changing password for user user02.

New LINUX password: (user02)

BAD PASSWORD: it is based on a dictionary word

Retype new LINUX password: (user02)

Enter new UNIX password: (user02)

Retype new UNIX password: (user02)

passwd: all authentication tokens updated successfully.

 

 

[EX2] su 명령어를 특정 사용자에게만 허가한다.

특정사용자만 특정한 그룹(보통 wheel)에 속하도록 하여 그 그룹에 속한 사요자만 특정한 권한을 가도록 하기 위해 pam_wheel.so라는 모듈을 제공한다. 또한 리눅스에서는 기본적으로 wheel 그룹이 생성되어 있다.

 

# usermod -G wheel user03

# grep user03 /etc/group (# id user03)

wheel:x:10:root,user03

user03:x:502:

 

# vi /etc/pamd.d/su

[수정전]

#%PAM-1.0

auth sufficient pam_rootok.so

#auth required /lib/security/pam_wheel.so debug group=wheel

# 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

[수정후]

#%PAM-1.0

auth sufficient pam_rootok.so

auth required /lib/security/pam_wheel.so debug group=wheel

# 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

 

# telnet localhost

user03 사용자로 로그인

 

$ su - root

-> root 사용자 암호 입력

# exit

$ exit

 

[참고] 필요하면 명령어 수행

# useradd user04

# echo user04 | passwd --stdin user04

 

# telnet localhost

user04 사용자로 로그인

 

$ su - root

Password:

su: incorrect password

 

 

[EX3] 특정 계정에 대해 telnet 접속을 막고, ftp 접속만 허가해 보자.

# vi /etc/pam.d/login

#%PAM-1.0

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

auth include system-auth

auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/loginusers onerr=succeed

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

 

 

[EX4] /etc/loginusers 파일에 등록된 사용자만 로그인을 허용하도록 해 보자.

# vi /etc/pam.d/login

#%PAM-1.0

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

auth include system-auth

auth required /lib/security/pam_listfile.so item=user sense=allow file=/etc/loginusers onerr=fail

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

 

# cat /etc/loginusers

user01

 

 

 

(8)참고

 

# man 5 passwd

# man 3 crypt

# man 5 pam.d

# man 5 group

# man 5 shadow

 

 

 

 

 

 

 

 



1.7 패스워드 최소 길이 설정

 

점검 분류 항목: 계정 관리

세부 점검 항목: 패스워드 최소길이 설정

대상: 리눅스

위험도:

관련 코드: U-07

 

(1) 취약점 개요

패스워드 무작위 대입 공격(Brute Force Attack)이나 패스워드 추측 공격(Password

Guessing)을 피하기 위하여 패스워드 최소 길이가 설정되어 있는지 점검함. 패스워드

최소 길이가 설정되어 있지 않거나, 짧게 설정되어 있을 경우 쉽게 유추될 수 있음.

 

(2) 판단기준

양호: 패스워드 최소 길이가 8자 이상으로 설정되어 있는 경우

취약: 패스워드 최소 길이가 8자 미만으로 설정되어 있는 경우

 

(3) 조치방법

패스워드 정책 설정파일을 수정하여 패스워드 최소 길이를 8자 이상으로 설정

 

(4) 보안 설정 방법

점검 방법

# cat /etc/login.defs

PASS_MIN_LEN 8

 

설정 방법

1. vi 편집기를 이용하여 “/etc/login.defs” 파일을 연 후

2. 아래와 같이 수정 또는, 신규 삽입

(수정 전) PASS_MIN_LEN 6

(수정 후) PASS_MIN_LEN 8

 

(5) 조치시 영향

일반적으로 영향 없음

 

(고객에게 설명)

패스워드의 최소 길이가 너무 작으면 패스워드 무작위 공격이나 패스워드 추측 공경등에 취약하다. 패스워드 추측 가능성이 높아짐

 

 

[실습] 암호 복잡성 테스트

/etc/login.defs 파일

/etc/shadow 파일(chage CMD)

 

암호의 복잡성에 대해서

 

사용자의 암호 정책(Password Aging)을 설정하는 방법

전역) /etc/login.defs

로컬) chage CMD, /etc/shadow

 

/etc/login.defs 파일

 

# man login.defs

NAME

login.defs - shadow password suite configuration

 

DESCRIPTION

The /etc/login.defs file defines the site-specific configuration

for the shadow password suite. This file is required. Absence of

this file will not prevent system operation, but will probably

result in undesirable operation.

 

# cat /etc/login.defs

# *REQUIRED*

# Directory where mailboxes reside, _or_ name of file, relative to the

# home directory. If you _do_ define both, MAIL_DIR takes precedence.

# QMAIL_DIR is for Qmail

#

#QMAIL_DIR Maildir

MAIL_DIR /var/spool/mail

#MAIL_FILE .mail

 

# Password aging controls:

#

# PASS_MAX_DAYS Maximum number of days a password may be used.

# PASS_MIN_DAYS Minimum number of days allowed between password changes.

# PASS_MIN_LEN Minimum acceptable password length.

# PASS_WARN_AGE Number of days warning given before a password expires.

#

PASS_MAX_DAYS 99999 /* MAX Chage: 암호를 사용할 수 있는 최대 날짜 */

PASS_MIN_DAYS 0 /* MIN Chage: 암호를 변경할 수 없는 최소 날짜 */

PASS_MIN_LEN 5 /* 패스워드 최소 길이 */

PASS_WARN_AGE 7 /* WARN Date: 패스워드 만료전 경고 메세지 주는 기간 */

 

#

# Min/max values for automatic uid selection in useradd

#

UID_MIN 500

UID_MAX 60000

 

#

# Min/max values for automatic gid selection in groupadd

#

GID_MIN 500

GID_MAX 60000

 

#

# If defined, this command is run when removing a user.

# It should remove any at/cron/print jobs etc. owned by

# the user to be removed (passed as the first argument).

#

#USERDEL_CMD /usr/sbin/userdel_local

 

#

# If useradd should create home directories for users by default

# On RH systems, we do. This option is overridden with the -m flag on

# useradd command line.

#

CREATE_HOME yes

 

# The permission mask is initialized to this value. If not specified,

# the permission mask will be initialized to 022.

UMASK 077

 

# This enables userdel to remove user groups if no members exist.

#

USERGROUPS_ENAB yes

 

# Use MD5 or DES to encrypt password? Red Hat use MD5 by default.

MD5_CRYPT_ENAB yes

-> 이 파일의 내용은 useradd 명령어를 통해 사용자를 추가할때 적용이 되는 기본 설정이다.

 

 

 

 

 

Password Aging 관리에 대해서

 

시스템 보안을 위해 사용자 패스워드 만기일을 설정 및 변경하는 명령어를 배워 보자.

password age(password aging)

 

(1) chage 명령어

 

(명령어 형식)

# chage [options] user

 

# chage --help

Usage: chage [options] user

 

Options:

-d, --lastday LAST_DAY set last password change to LAST_DAY

-E, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE

-h, --help display this help message and exit

-I, --inactive INACTIVE set password inactive after expiration

to INACTIVE

-l, --list show account aging information

-m, --mindays MIN_DAYS set minimum number of days before password

change to MIN_DAYS

-M, --maxdays MAX_DAYS set maximim number of days before password

change to MAX_DAYS

-W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS

 

 

(명령어 사용예)

# chage -M 30 -W 7 user01 /* -M : Max chage, -W : Warn date */

# chage -E 2010-03-30 user01 /* -E : Expire date */

# chage -l user01 /* -l : list */

 

(/etc/shadow)

user01:$1$eG0hsAqw$Cfawvh5OsIye2rKYcRPH.0:Last Change:MIN:MAX:WARN:INACTIVE:Expire Date:

user01:$1$eG0hsAqw$Cfawvh5OsIye2rKYcRPH.0:14650:0:99999:7:::

user01:$1$eG0hsAqw$Cfawvh5OsIye2rKYcRPH.0:14650:30:90:7:30:15000:

 

1 : 암호화 알고리즘(1: MD5)

eG0hsAqw : salt key

Cfawvh5OsIye2rKYcRPH.0 : 암호화된 암호(password)

 

Last Change : 암호가 변경된 날짜를 일수로 환산(기준시간), 197011

Min Change : 암호를 변경할 수 없는 최소 날짜

Max Change : 암호를 변경 사용할 수 있는 최대 날짜

Wan Date : 경고 메세지를 주는 기간(Max Change)

Inactive : 암호를 비활성화 하는 기간(Max Change)

Expire Date : 암호를 사용할 수 있는 최대 날짜(절대값)

 

 

다음은 패스워드 에이징(Password Aging)에 대한 설명 그림이다.

 

현재(암호가 변경된 날짜)

|

| 30(MIN) 90(MAX) 2014.12.31(ExpireDate)

| | | |

|------------------------+--------------------------+---------------------------+---

| |7(WARN)|

 

90(MAX) 30(Inactive) 2014.12.31(ExpreDate)

| | |

|------------------------+------------------------------------------------------+

|

 

[그림] Password Aging

 

 

 

 

[EX1] 패스워드 변경후 다시 변경할 수 있는 최소 날짜(Min Chage 설정)

 

(전제조건) user01/user02/user03 사용자가 존재해야 한다.

- 기존의 사용자 모두 삭제(user01, user02, user03, ..... user100, user101)

# userdel -r user01

 

[참고] 사용자 삭제

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

# for U_NAME in `awk -F: '$3 > 499 && $3 < 60000 {print $1}' /etc/passwd`

do

userdel -r $U_NAME

sleep 1

done

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

 

- 새로운 사용자 추가(user01, user02, user03)

# useradd user01

# echo user01 | passwd --stdin user01

 

[참고] 사용자 추가

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

# for U_NAME in user01 user02 user03

do

useradd $U_NAME

echo $U_NAME | passwd --stdin $U_NAME

done

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

 

# chage -l user01

Last password change : Feb 10, 2010

Password expires : never

Password inactive : never

Account expires : never

Minimum number of days between password change : 0

Maximum number of days between password change : 99999

Number of days of warning before password expires : 7

 

# cat /etc/shadow | grep user01

user01:$1$2m3GgTgT$bM5ZxsZqpCi/hkPV0Ytpe.:16129:0:99999:7:::

 

# chage -m 7 user01 /* -m : MIN Change */

# chage -l user01

Last password change : Apr 01, 2010

Password expires : never

Password inactive : never

Account expires : never

Minimum number of days between password change : 7

Maximum number of days between password change : 99999

Number of days of warning before password expires : 7

 

# telnet localhost

user01 사용자로 로그인

 

$ passwd

Changing password for user user01.

Changing password for user01

(current) UNIX password: (user01)

You must wait longer to change your password <--- 사용자는 7일이전에 암호를 변경할 수 없다.

passwd: Authentication token manipulation error

 

$ exit

# grep user01 /etc/shadow

user01:$1$6.SEUwAq$lgBNtj6Q0XTp3VknOCyA01:16944:7:99999:7:::

 

 

 

 

[EX2] 패스워드 변경 후 다시 변경할 수 있는 최소 날짜(MAX Chage 설정)

# chage -M 30 user02 /* -M : MAX Change */

# chage -l user02

Last password change : Mar 01, 2010

Password expires : Mar 31, 2010

Password inactive : never

Account expires : never

Minimum number of days between password change : 0

Maximum number of days between password change : 30

Number of days of warning before password expires : 7

 

현재(암호가 변경된 날짜)

|

| 30(MAX)

| |

|------------------------+--------------------------+---------------------------+---

| |7(WARN)|

3242

 

 

# date

Mon Mar 1 23:06:44 KST 2010

 

# date 03282306 (032823:06)

Sun Mar 28 23:06:00 KST 2010

 

# telnet localhost

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

 

linux101.example.com (Linux release 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 07:39:04 EST 2010) (4)

 

login: user02

Password: (user02 사용자 암호 입력)

[Warning: your password will expire in 3 days]

 

$ exit

# chage -l user02

Last password change : Mar 01, 2010

Password expires : Mar 31, 2010

Password inactive : never

Account expires : never

Minimum number of days between password change : 0

Maximum number of days between password change : 30

Number of days of warning before password expires : 7

 

# date 04202306 (042023:06)

Tue Apr 20 23:06:00 KST 2010

 

# telnet localhost

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

 

linux101.example.com (Linux release 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 07:39:04 EST 2010) (4)

 

login: user02

Password: user02

[You are required to change your password immediately (password aged)]

[Changing password for user02]

(current) UNIX password: user02

New UNIX password: (새로운 암호 입력 : acbd1324)

Retype new UNIX password: (새로운 암호 입력 : acbd1324)

Last login: Sun Mar 28 23:06:51 from linux101

 

$ exit

#

 

[참고] rdate 명령어 사용법

# rdate -p time.bora.net /* -p : peer */

# rdate -s time.bora.net /* -s : setting */

 

# rdate -s time.bora.net

# date

-> 시스템 시간 복구

 

# chage -E 2010-11-30 user03 /* -E : Expire Date */

# chage -l user03

Last password change : Mar 02, 2010

Password expires : never

Password inactive : never

Account expires : Nov 30, 2010

Minimum number of days between password change : 0

Maximum number of days between password change : 99999

Number of days of warning before password expires : 7

 

# date 12301200 (123012:00)

Tue Dec 30 12:00:00 KST 2010

 

# telnet localhost

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

 

linux101.example.com (Linux release 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 07:39:04 EST 2010) (4)

 

login: user03

Password:(사용자 암호 입력)

[Your account has expired; please contact your system administrator]

Login incorrect

Connection closed by foreign host.

 

# grep user /etc/shadow

user01:$1$6YRLZe7X$Wq2IPhlAPCe.aiRU.bw.t1:14670:7:99999:7:::

user02:$1$NnSNmm9/$XrmbouuCWFxPjvrr4UKvP/:14719:0:30:7:::

user03:$1$wCwjYBvI$zdKUYhOks6c9Hu3Ejw5nr1:14670:0:99999:7::14943:

 

# chage -E "" user03

# chage -l user03

 

 

 

 

(복원) user01, user02, user03 삭제하고 새로 생성(user01, user02, user03)

(사용자 삭제 형식)

# userdel -r user01

 

(사용자 추가 형식)

# useradd user01

# passwd user01 (# echo user01 | passwd --stdin user01)

 

[참고] 사용자 삭제

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

# for U_NAME in `awk -F: '$3 > 499 && $3 < 60000 {print $1}' /etc/passwd`

do

userdel -r $U_NAME

sleep 1

done

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

 

- 새로운 사용자 추가(user01, user02, user03)

# useradd user01

# echo user01 | passwd --stdin user01

 

[참고] 사용자 추가

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

# for U_NAME in user01 user02 user03

do

useradd $U_NAME

echo $U_NAME | passwd --stdin $U_NAME

done

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

 

시간 복원 작업

# rdate -p time.bora.net

# date

 

# rdate -s time.bora.net

# date

 

 

 

 


 

[실습] 암호 크랙에 대한 테스트(과제)

개인적인 실습으로 진행한다.

- John The Ripper 대한 실습

CentOS에는 John The Ripper 툴이 설치 되어 있지 않음

-> sourceforge.net 다운로드

 

[실습] SetUID 비트를 제거하여 관리자만 암호를 변경할 수 있도록 설정

-> /usr/bin/passwd 명령어의 SetUID 비트 제거

-rwsr-xr-x 1 root root 23K Aug 11 2010 /usr/bin/passwd*

# chmod 755 /usr/bin/passwd

# chmod 4755 /usr/bin/passwd

 

[실습] /etc/passwd, /etc/shadow 파일의 백업본에 대해서

 

 

(정리) 보안 정책

서버에 대한 관리자 암호를 변경할수 없도록 제어

- 물리적인 보안(H/W Security)

- BIOS/CMOS 관리자 암호 설정

- GRUB 암호 설정

 

 

(스크립트 제작)

# NUM=`grep PASS_MIN_LEN /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MIN_LEN' | \

awk '{print $2}'`

# if [ $NUM -ge 8 ] ; then

echo "OK"

else

echo "WARN"

fi

 

 

 

 

 

 

1.8 패스워드 최대 사용기간 설정

 

점검 분류 항목: 계정 관리

세부 점검 항목: 패스워드 최대 사용기간 설정

대상: 리눅스

위험도:

관련 코드: U-08

 

(1) 취약점 개요

패스워드 최대 사용기간을 설정하지 않은 경우 일정 기간 경과 후에도 유출된

패스워드로 접속이 가능함. 악의적인 사용자로부터 계속적인 접속을 차단하기 위해

패스워드 최대 사용기간을 설정하여 주기적으로 변경할 수 있도록 함.

 

(2) 판단기준

양호: 패스워드 최대 사용기간이 90(12) 이하로 설정되어 있는 경우

취약: 패스워드 최대 사용기간이 90(12) 이하로 설정되어 있지 않는 경우

 

(3) 조치방법

패스워드 정책 설정파일을 수정하여 패스워드 최대 사용기간을 90(12)로 설정

 

(4) 보안 설정 방법

점검 방법

# cat /etc/login.defs

PASS_MAX_DAYS 90

 

설정 방법

1. vi 편집기를 이용하여 “/etc/login.defs” 파일을 연 후

2. 아래와 같이 수정 또는, 신규 삽입

(수정 전) PASS_MAX_DAYS 99999

(수정 후) PASS_MAX_DAYS 90 (단위: )

 

(5) 조치시 영향

일반적으로 영향 없음

 

(고객에게 설명)

 

실습은 이전 실습을 참고한다.

 

(스크립트 제작)

# NUM=`grep PASS_MAX_DAYS /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MAX_DAYS' | \

awk '{print $2}'`

# if [ $NUM -le 90 ] ; then

echo "OK"

else

echo "WARN"

fi

 

 

 

 

1.9 패스워드 최소 사용기간 설정

 

점검 분류 항목: 계정 관리

세부 점검 항목: 패스워드 최소 사용기간 설정

대상: 리눅스

위험도:

관련 코드: U-09

 

(1) 취약점 개요

패스워드 최소 사용기간을 설정하지 않은 경우 사용자에게 익숙한 패스워드로 변경이

가능하며, 이를 재사용함으로써 패스워드의 정기적인 변경은 무의미해질 수 있음.

이전 암호를 그대로 재사용하는 것을 방지하기 위해 최근 암호 기억 설정을 함께

적용하여 패스워드를 보호함.

 

(2) 판단기준

양호: 패스워드 최소 사용기간이 1(1)로 설정되어 있는 경우

취약: 패스워드 최소 사용기간이 설정되어 있지 않는 경우

 

(3) 조치방법

패스워드 정책 설정파일을 수정하여 패스워드 최소 사용기간을 1(1)로 설정

 

(4) 보안 설정 방법

점검 방법

# cat /etc/login.defs

PASS_MIN_DAYS 1

 

설정 방법

1. vi 편집기를 이용하여 “/etc/login.defs” 파일을 연 후

2. 아래와 같이 수정 또는, 신규 삽입

(수정 전) PASS_MIN_DAYS

(수정 후) PASS_MIN_DAYS 1 (단위: )

 

(5) 조치시 영향

일반적으로 영향 없음

 

 

(고객에게 설명)

 

실습은 이전 실습을 참고한다.

 

(스크립트 제작)

# NUM=`grep PASS_MIN_DAYS /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MIN_DAYS' | \

awk '{print $2}'`

# if [ $NUM -ge 1 ] ; then

echo "OK"

else

echo "WARN"

fi

 

 

[패스워드 정책 실습]

(1) 패스워드의 최소 길이 설정 8글자 이상

- /etc/login.defs(PASS_MIN_LEN)

(2) 패스워드는 문자 2글자 다른 문자(숫자 또는 특수문자) 1 글자 이상

- /etc/pam.d/passwd(/etc/pam.d/system-auth(pam_cracklib.so))

(3) 패스워드의 Min Age7 설정

- /etc/login.defs(PASS_MIN_DAYS)

(4) 패스워드 Max Age90 설정

- /etc/login.defs(PASS_MAX_DAYS)

(5) 패스워드 히스토리 기능, 이전 암호 4개 까지 저장

- /etc/pam.d/passwd, /etc/pam.d/system-auth(pam_unix.so(remember=N)),

- /etc/pam.d/system-auth(pam_pwhistory.so)

(6) root 사용자는 원격(EX: telnet)에서 로그인 금지, 시스템 관리자는 user01 사용자로 로그인하여 su 명령어를 통해 swiching 하도록 설정(, user01 사용자만 su 명령어를 사용해야 한다.)

- /etc/securetty, /etc/pam.d/login(pam_securetty.so),

- /etc/pam.d/su(pam_wheel.so), /etc/group

(7) user02 사용자는 /sbin/shutdown 명령어만 사용가능(, su 명령어를 사용하지 않고 sudo 명령어를 사용하도록 해야 한다.)

- /etc/sudoers(user02, %user02)

(8) 일반 사용자가 원격에서 로그인하는 경우 5번 암호 실패 후 lock 되고 20분후에 다시 시도할 수 있도록 설정한다.

- /etc/pam.d/login, /etc/pam.d/system-auth(pam_tally.so, pam_tally2.so)

 

 

[스크립트 제작 예제] /root/bin/check.log, /root/bin/check.sh

# vi /root/bin/check.sh

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

프로그램 제작

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

# chmod 700 /root/bin/check.sh

# ./check.sh

-> 점검된 내용은 /root/bin/check.log 파일에 저장한다.

 

 

(예제 프로그램)

# cd /root/bin

# vi check.sh

#!/bin/bash

 

> check.log

LOG=check.log

 

cat << EOF >> $LOG

(1) password minimum length check

OK : 8 글자 이상

WARN: 8 글자 미만

 

# cat /etc/login.defs

EOF

 

echo "---------------------------------------------" >> $LOG

C_LINE=`grep PASS_MIN_LEN /etc/login.defs | grep -v '^#'`

NUM=`echo $C_LINE | awk '{print $2}'`

if [ $NUM -ge 8 ] ; then

echo "[ OK ] : $C_LINE" >> $LOG

else

echo "[ WARN ] : $C_LINE" >> $LOG

fi

echo "---------------------------------------------" >> $LOG

 

cat $LOG

 

# chmod 700 check.sh

# ./check.sh

(1) password minimum length check

OK : 8 글자 이상

WARN: 8 글자 미만

 

# cat /etc/login.defs

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

[ WARN ] : PASS_MIN_LEN 5

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



'모의해킹 침해대응 전문가 과정' 카테고리의 다른 글

20160727 리눅스 서버보안  (0) 2016.07.27
20160726 리눅스 서버보안  (0) 2016.07.26
20160722 리눅스 서버보안  (0) 2016.07.22
20160714 무선해킹  (0) 2016.07.14
20160714 프로젝트#3  (0) 2016.07.14
Posted by 22Hz
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함