20160725 리눅스 서버보안
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 명령어
(linux200)
① 기본 체계에 대한 확인 # ls -l /etc/passwd /etc/shadow
② pwconv/pwunconv 명령어 사용법 확인
/etc/passwd 체계 ------- pwconv -------> /etc/passwd, /etc/shadow 체계 <------ pwunconv --------
# man pwconv
③ pwunconv 명령어 수행
/etc/passwd, /etc/shadow 체계 ------- pwunconv -------> /etc/passwd 체계
# pwunconv # ls -l /etc/passwd /etc/shadow
[참고] KaliLinux 에서 # unshadow /etc/passwd /etc/shadow > pass.txt # john pass.txt
# cat /etc/passwd
④ pwconv 명령어 수행
/etc/passwd 체계 ------- pwconv -------> /etc/passwd, /etc/shadow 체계
# pwconv # ls -l /etc/passwd /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
② usermod 명령어의 사용법 확인 # man usermod
# egrep '(user01|user02)' /etc/passwd
# usermod -u 0 user01
# usermod -u 0 -o user01 # grep --color user01 /etc/passwd
# telnet localhost user01 사용자로 로그인
# id
# 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
[참고] 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
운영체제 버전에 맞게 라인 추가 (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
# id -a 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 -
# exit $ exit
# telnet localhost user02 사용자로 로그인
$ su -
$ 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은 네개의 타입을 인식한다.
■ control(제어) 통제 토큰은 이 모듈이 동작하지 않는다면 PAM에게 무엇을 해야할 지 알려주는 것이다. PAM은 네가지의 통제 형식을 인식한다.
로그인에 대한 구성파일에서 거의 모든 통제타입이 다르다는 알 수 있다. 대부분의 요청되어지는 모듈들은 pam_unix.so(주요 인증 모듈)이고, 단 한 개의 requitsite 모듈은 pam_securitty.so 이다(사용자가 안전한 콘솔에 로그인한다는 것을 확인하는 것이다). 그리고 유일한 선택모듈은 pam_lastlogin.so 이다(사용자의 가장 최근 로그 정보를 가지고 오는 모듈)
■ module-path(모듈 경로)
모듈경로는 PAM에게 어떤 모듈을 사용할 것인지(선택적으로) 그리고 그것을 어디서 찾을 지를 알려준다. 대부분 구성은 로그인 구성파일의 경우와 마찬가지로 모듈의 이름만 가지고 있다. 이와 같은 경우, PAM은 기본 PAM 모듈의 디렉토리에서(보통 /usr/lib/security) 모듈을 찾는 다. 그러나 여러분의 리눅스가 리눅스 파일시스템의 표준을 따른다면 PAM 모듈은 /lib/security에 있다.
# which passwd
# ldd /usr/bin/passwd
■ module-arguments(모듈 인수)
모듈-인수는 모듈에게 전달되는 인수이다. 각각의 모듈은 각각의 인수를 가지고 있다. 예를 들어 로그인 구성에서 "nulok"가 그것이다. ("null ok", pam_unis.so 모듈로 전달되어 지는 인수로서 공백(null)패스워드를 허용한다는 것이다("ok")).
(5) 주요 PAM 파일
(CentOS 5.X)
# cd /etc/pam.d # ls
■ /etc/pam.d/login 슈퍼 유저로 로그인할 수 있는 사용자 인증과 관련된 파일이다.
# cat login
■ /etc/pam.d/other PAM에서 별도로 지정하지 않은 서비스에 대한 인증을 위한 참조하는 파일이다.
# cat other
(6) 주요 PAM 모듈
# cd /lib/security # ls
■ /lib/security/pam_securetty.so 모듈
# man pam_securetty
표준 UNIX securetty 검사해서 /etc/securetty 파일에 기록된 내용과 비교하는데 root 계정인 경우에만 확인한다. 그 외의 다른 사용자에 대해서는 항상 인증이 성공한 것으로 처리한다. 다른 sufficient 인증 방법보다 앞서 require 인증방법으로 등록하는 것이 표준 사용방식이다.
(사용예) # find /etc/pam.d -type f -exec grep -l securetty {} \;
# cat /etc/pam.d/login
■ /lib/security/pam_listfile.so 모듈 임의의 파일에 대한 서비스를 허가하거나 거부하는 방법을 제공한다.
# man pam_listfile
모듈 인자 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
위와 같은 식으로 다음과 같은 모듈을 분석하여 본다. ■ /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
# cat /etc/pam.d/system-auth
# vi /etc/pam.d/passwd
-> /etc/pam.d/system-auth 파일의 설정을 따르지 않고 새로운 모듈로 설정하였다.
# vi /etc/pam.d/system-auth
# telnet localhost user02 사용자로 로그인
$ passwd
-> 현재 암호를 물어 보고 맞추면, 새로운 암호를 3번 물어 본다.(retry=3) -> 암호 재입력(retry)를 3번하라고 정의해서 그렇다.
$ exit # passwd user02
[EX2] su 명령어를 특정 사용자에게만 허가한다. 특정사용자만 특정한 그룹(보통 wheel)에 속하도록 하여 그 그룹에 속한 사요자만 특정한 권한을 가도록 하기 위해 pam_wheel.so라는 모듈을 제공한다. 또한 리눅스에서는 기본적으로 wheel 그룹이 생성되어 있다.
# usermod -G wheel user03 # grep user03 /etc/group (# id user03)
# vi /etc/pamd.d/su
# telnet localhost user03 사용자로 로그인
$ su - root -> root 사용자 암호 입력 # exit $ exit
[참고] 필요하면 명령어 수행 # useradd user04 # echo user04 | passwd --stdin user04
# telnet localhost user04 사용자로 로그인
$ su - root
[EX3] 특정 계정에 대해 telnet 접속을 막고, ftp 접속만 허가해 보자. # vi /etc/pam.d/login
[EX4] /etc/loginusers 파일에 등록된 사용자만 로그인을 허용하도록 해 보자. # vi /etc/pam.d/login
# cat /etc/loginusers
(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
# cat /etc/login.defs
-> 이 파일의 내용은 useradd 명령어를 통해 사용자를 추가할때 적용이 되는 기본 설정이다.
Password Aging 관리에 대해서
시스템 보안을 위해 사용자 패스워드 만기일을 설정 및 변경하는 명령어를 배워 보자. password age(password aging)
(1) chage 명령어
(명령어 형식) # chage [options] user
# chage --help
(명령어 사용예) # 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)
1 : 암호화 알고리즘(1: MD5) eG0hsAqw : salt key Cfawvh5OsIye2rKYcRPH.0 : 암호화된 암호(password)
Last Change : 암호가 변경된 날짜를 일수로 환산(기준시간), 1970년 1월1일 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
# cat /etc/shadow | grep user01
# chage -m 7 user01 /* -m : MIN Change */ # chage -l user01
# telnet localhost user01 사용자로 로그인
$ passwd
$ exit # grep user01 /etc/shadow
[EX2] 패스워드 변경 후 다시 변경할 수 있는 최소 날짜(MAX Chage 설정) # chage -M 30 user02 /* -M : MAX Change */ # chage -l user02
현재(암호가 변경된 날짜) | | 30(MAX) | | |------------------------+--------------------------+---------------------------+--- | |7(WARN)| 3월2일 4월2일
# date
# date 03282306 (03월28일 23:06)
# telnet localhost
$ exit # chage -l user02
# date 04202306 (04월20일 23:06)
# telnet localhost
$ 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
# date 12301200 (12월30일 12:00)
# telnet localhost
# grep user /etc/shadow
# 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 Age는 7 설정
- /etc/login.defs(PASS_MIN_DAYS)
(4) 패스워드 Max Age는 90 설정
- /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 |