리눅스 접속 관련 보안 설정 정리 – Passwd, PAM, etc

일반
접속자 관련 유틸리티
아래의 명령어들은 사용자의 로그인 정보에 대한 것을 알 수 있는 것들이다.

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를 통해 로그인 되어 있는 사용자의 숫자와 허용할 수 있는 최대 사용자의 숫자만 보여준다.

레드햇 패키지 관리자(RPM)
서버 서비스를 위해서 패포판 업체에서 제공하는 모든 패키지가 필요하지는 않다. (예를 들자면, 컴파일러, 개발 패키지 등등) 설치되어 있지만, 필요하지 않은 패키지들은 과감하게 삭제한다. 아래에는 RPM 패키지들을 관리하기 위한 기본적인 RPM 명령어들이다.:

RPM 패키지 설치: rpm -ivh package_name.rpm
RPM 패키지 삭제: rpm -e package_name
RPM 패키지를 삭제할 경우 –test 옵션을 사용하면 테스트를 할 수 있다.(의존성 검사 등등): rpm -e –test package_name
RPM 패키지를 설치하거나 현재 설치된 것보다 더 최근의 버전으로 업그레이드: rpm -Uvh package_name.rpm
현재 설치된 버전보다 최신의 버전으로만 업그레이드 하기: rpm -Fvh package_name.rpm
현재 설치된 모든 패키지 보기: rpm -qa
특정 RPM 패키지에 대한 정보 얻기: rpm -qi package_name
RPM 패키지내의 파일과 디렉토리 리스트 보기(설치된 파일들): rpm -ql package_name
RPM 패키지내의 파일과 디렉토리 리스트 보기(설치될 파일들): rpm -qpl package_name.rpm
현재 설치되어 있는 파일들 중 특정 파일이 어느 패키지에 포함되어 있는지 알아보기: rpm -qf /bin/ls

/etc/inittab 파일 관리
“Control-Alt-Del” 키보드 눌림 막기
“Control-Alt-Del” 키의 눌림이 발생했을 경우 아무런 작업도 하지 않게 하려면, /etc/inittab에서 다음과 같은 라인을 찾아서 주석 처리한다:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
수정된 파일을 바로 적용하려면, 다음의 명령을 사용한다.:
[root@linux ~]# init q

단일 사용자(Single User) Mode Password
일반적으로 리눅스에서는 싱글 유저모드로 부팅할 경우 root 사용자의 패스워드를 묻지 않는다. 다음과 같은 라인을 /etc/inittab파일에 추가하면, 싱글 유저모드라 할지라도 패스워드를 요구하게 된다.:
#~~:S:wait:/sbin/sulogin
만약 자기 자신이 관리하는 서버의 root 패스워드를 잊었을 경우에는 부팅 화면에서 “linux single”을 사용하는 대신에 “linux init=/bin/bash”을 사용하면 root 패스워드를 물어보지 않는다.

사용자 계정 관리
아래의 파일과 변수들은 useradd 명령을 사용해서 새로운 계정을 생성할 경우에 사용한다. 여기에서 설정된 값들은 /etc/passwd 파일과 /etc/shadow 파일에 저장된다. 어떤 사용자 계정을 추가하려고 할 경우에 변수의 변경은 매우 중요하다.
/etc/login.defs PASS_MAX_DAYS 기본값: 99999 비밀번호를 변경하지 않고 사용할 수 있는 최대 유효 기간
/etc/login.defs PASS_MIN_DAYS 기본값: 0 비밀번호 변경을 허용하는 최소 사용 기간
/etc/login.defs PASS_WARN_AGE 기본값: 7 비밀번호 변경 경고 메세지 보내는 기간(유효기간으로부터 x일)
/etc/login.defs UID_MIN 기본값: 500 자동으로 설정되는 UID의 최소값
/etc/login.defs GID_MIN 기본값: 500 자동으로 설정되는 GID의 최소값
/etc/login.defs PASS_MIN_LEN 기본값: 없음 비밀번호 최소길이를 설정하지만 적용되지 않음. “pam_cracklib” 이라는 PAM 모듈로 대체되었음. pam_cracklib의 “minlen” 변수를 참고하라.
/etc/default/useradd GROUP 기본값: 100 기본 그룹
/etc/default/useradd HOME 기본값: /home 사용자 기본 홈 디렉토리
/etc/default/useradd INACTIVE 기본값: 없음 유효기간이 지난 비밀번호를 사용자가 변경할 수 있는 기간
/etc/default/useradd EXPIRE 기본값: 없음 사용자 계정을 사용할 수 없게된 날짜. YYYY-MM-DD 형식.
/etc/default/useradd SHELL 기본값: /bin/bash 기본 쉘 설정
/etc/default/useradd SKEL 기본값: /etc/skel 기본 프로파일 디렉토리

useradd 명령을 이용해서 사용자 계정을 생성할 때 위의 정보들은 /etc/passwd 파일과 /etc/shadow 파일에 아래와 같은 순서로 기록된다.:
/etc/passwd:
〈사용자명〉:x:UID_MIN+:GROUP:설명:HOME/〈사용자명〉:SHELL

/etc/shadow:
〈사용자명〉:〈암호화된 비밀번호〉:〈마지막으로 비밀번호를 바꾼 날짜〉:PASS_MIN_DAYS:PASS_MAX_DAYS:PASS_WARN_AGE:INACTIVE:EXPIRE

아래에 useradd 명령을 이용해서 사용자를 추가하는 예제가 있다.:
[root@linux ~]# useradd -n -c “Oracle Owner” -g oinstall -G dba oracle
-n : 기본적으로 사용자명과 동일한 그룹명이 만들어지고, 추가된 사용자는 생성된 그룹에 포함된다. 하지만 이 옵션을 사용할 경우 사용자명과 동일한 그룹명이 만들어지지 않으며, 자동적으로 users라는 그룹에 포함된다. 만약 -g 옵션을 사용하면 할당된 그룹이 기본 그룹으로 설정된다.
-c : 사용자의 실제 이름이나 별명을 설정한다. 즉, 계정에 대한 설명을 하는 것이다.
-g : 사용자가 속할 기본 그룹을 지정한다. 여기서 지정하는 그룹은 이미 존재해야 한다
-G : 사용자가 추가될 그룹의 이름을 지정한다. 여기서 지정하는 그룹은 이미 존재해야 하며, 그 그룹에 사용자를 추가하는 것이다.
아래의 명령을 이용하여 사용자 계정이 포함되어 있는 그룹을 확인할 수 있다.:
[root@linux ~]# id oracle
uid=501(oracle) gid=502(oinstall) groups=502(oinstall),501(dba)

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

– 비밀번호는 최소 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_tally.so
ppam_tally.so 모듈은 접근을 시도한 횟수를 보관하며, 성공적으로 로그인 되었을 경우 초기화된다. 지정한 횟수 이상 로그인에 실패하게 되면, 해당 계정에 대해서 접근을 거부한다.
/lib/security/pam_tally.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_tally.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_tally.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”라는 사용자 계정이 없어야만 제대로 작동한다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.