일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MYSQL
- 애플
- 앱스토어
- OTP
- css
- albumbook
- SwiftUI
- openssl
- 앱리소스
- 안드로이드
- apple
- 앨범북
- FIDO2
- 2FA
- OSX
- Android
- SSL
- appres
- git
- SWIFT
- kmip
- MSYS2
- 인증
- fido
- WebAuthn
- MFA
- SSH
- Xcode
- otpkey
- Nodejs
- Today
- Total
인디노트
PAM 기본 자료 본문
PAM 이란 Pluggable Authentication Module 을 뜻하며
사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 제어하는 모듈화된 방법을 뜻합니다.
PAM 설정의 기본 구조
type control module-path module-arguments
PCM 설정의 예
#%PAM-1.0
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_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
구성의 종류
type
이 부분은 PAM에 어떤 타입의 인증이 사용될 것인지를 알려준다. 같은 타입의 모듈은 쌓일 수 있고, 사용자에 인증되기 위한 다중 요구사항을 만족하도록 요청할 수 있다.
다음과 같은 4개의 타입이 있다.
- account: 계정은 사용자가 해당 서비스에 접근이 허용되었는지, 패스워드가 기간이 만료가 되었는지를 결정한다.
- auth: 주로 패스워드를 통하지만 생체인증과 같은 보다 정교한 방법을 통해서 사용자가 자신이 주장하는 사용자가 맞는지를 결정한다.
- password: 패스워드는 사용자가 그들의 인증을 변경하도록 어떤 방법을 제공한다. 이것을 결정하는 것이 패스워드이다.
- session: 사용자가 인증받기 전후에 해야 할 것을 나타낸다. 사용자의 홈디렉토리를 마운트/언마운트, 로그인/로그아웃 서비스를 제한하는 등의 포함한다.
control
통제를 담당하는 부분으로 PAM에 무엇을 해야할 지를 알려준다.
4가지의 형식이 있다.
- requisite: 이 모듈을 이용하는 인증이 실패할 경우, 즉시 인증을 거부하도록 한다.
- required: 인증이 거부되기 전에 비록 PAM이 이 서비스에 등록된 다른 모든 모듈들을 요구 함에도 불구하고 실패할 경우 인증을 거부하도록 한다.
- sufficient: 비록 이전에 요청되어진 모듈이 실패하더라도 이 모듈에 의해서 인증이 성공할 경우, PAM은 인증을 승인한다.
- optional : 이 모듈이 서비스에 대한 응용프로그램의 성공/실패에 중요하지 않다는 것을 의미한다. 보통 PAM은 모듈들의 성공/실패 판단시에 이런 모듈은 무시한다. 그러나 이전/이후의 모듈들이 명확한 성공/실패가 없다면 이 모듈이 응용프로그램에게 주는 결과를 결정짓는다.
module-path
모듈경로는 PAM에게 어떤 모듈을 사용하고 그 경로를 알려준다. 대부분 PAM 모듈은 /lib/security에 있다.
module-argument
모듈-인수는 모듈에게 전달되는 인수를 나타낸다. 각각의 모듈은 각각의 인수를 가지고 있다.
주요파일
#cat /etc/pam.d/login
슈퍼유저로 로그인할 수 있는 사용자 인증과 관련된 파일이다.
#%PAM-1.0
auth required /lib/security/pam_securetty.so
// pam_securetty.so 모듈이 지정해놓은 보안 규칙을 만족해야만 로그인이 허용된다는
//뜻이다. 이 모듈은 /etc/securetty 파일에서 지정되어있는 tty에서 요청한 슈퍼유저
//만 로그인을 허용한다.
auth required /lib/security/pam_stack.so service=system-auth
auth required /lib/security/pam_nologin.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
#cat /etc/pam.d/other
PAM에서 별도로 지정하지 않은 서비스에 대한 인증을 위한 참조하는 파일이다.
#%PAM-1.0
auth required /lib/security/pam_deny.so
account required /lib/security/pam_deny.so
password required /lib/security/pam_deny.so
session required /lib/security/pam_deny.so
=> 알지 못하는 서비스가 4개의 구성타입 중 어떤 곳에 접근을 시도하더라도 PAM은
인증을 거부한다.(pam_deny.so 모듈이 담당한다.)
주요 모듈에 대한 설명
리눅스(레드햇 8.0기준)에서 사용가능한 모듈들은 /lib/security디렉토리에 있다. 주요 모듈에 대해 알아본다.
[root@www root]# cd /lib/security
[root@www security]# ls
pam_access.so pam_group.so pam_mail.so pam_shells.so pam_unix_auth.so
pam_chroot.so pam_issue.so pam_mkhomedir.so pam_smb_auth.so pam_unix_passwd.so
pam_console.so pam_krb5.so pam_motd.so pam_stack.so pam_unix_session.so
pam_cracklib.so pam_krb5afs.so pam_nologin.so pam_stress.so pam_userdb.so
pam_deny.so pam_lastlog.so pam_permit.so pam_tally.so pam_warn.so
pam_env.so pam_ldap.so pam_pwdb.so pam_time.so pam_wheel.so
pam_filter pam_limits.so pam_rhosts_auth.so pam_timestamp.so pam_winbind.so
pam_filter.so pam_listfile.so pam_rootok.so pam_unix.so pam_xauth.so
pam_ftp.so pam_localuser.so pam_securetty.so pam_unix_acct.so
pam_securetty.so
ㄱ. 설명: 이 모듈은 표준의 UNIX securetty검사해서 /etc/securetty파일에 기록된 내용과 비교
하는데 root계정인 경우에만 확인한다.
그 외의 다른 사용자에 대해서는 항상 인증이 성공한 것으로 처리한다.
다른 sufficient인증 방법보다 앞서 require인증방법으로 등록하는 것이 표준사용방식이다
ㄴ. 사용된 곳 : /etc/pam.d/login 등
pam_listfile.so
ㄱ. 설명: 이 모듈은 임의의 파일에 대해 서비스를 허가하거나 거부하는 방법을 제공한다.
ㄴ. 모듈인자(module-argument)
onerr=succeed|fail
=> onerr=succeed이면 PAM_SUCCESS를 리턴하고, onerr=fail이면 PAM_AUTH_ERR 또는 PAM_SERVICE_ERR 이 리턴된다. 보통 sense와 반대로 적는다.
file=filename
=> 지정한 파일을 읽는다. 한줄에 한 아이템만 적는다.
sense=allow|deny
=> allow는 특정한 아이템이 발견되면 PAM_SUCCESS가 리턴되고 권한요구는 성공한다. 값이 deny이면 PAM_AUTH_ERR이 리턴되고 권한요구는 실패한다.
item=user|tty|rhost|ruser|group|shell
=> 아이템을 지정한다. 각각 사용자명, 요청한 터미널, 원격사용자,그룹,쉘을 나타낸다.
apply=user|@group
=> 특정사용자 또는 주어진 그룹으로 적용을 제한하는데 사용한다. 이것은 tty, rhost, shell아이템과 함께 사용될 때만 의미가 있는 제한이다. 생성시에 이 모듈인자를 제외하고는 모듈인자는 필수적이다.
ㄷ. 사용예(/etc/pam.d/ftp)
[root@www root]# cat /etc/pam.d/ftp
#%PAM-1.0
auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc
/ftpusers onerr=succeed
auth required /lib/security/pam_stack.so service=system-auth
auth required /lib/security/pam_shells.so
account required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
pam_nologin.so
ㄱ. 설명:
/etc/nologin파일이 존재하면 root만 로그인할 수 있고 다른 사용자는 에러메시지와 함께 거부된다.
/etc/nologin파일이 없다면 모듈은 성공을 리턴한다.
이 모듈을 효과적으로 사용하려면 모든 login방법들(login, rlogin 등)이 이것을 사용하게 해야 한다.
또한 이 설정은 sufficient 모듈 앞에 required로 설정해야 한다.
ㄴ. 사용된곳: /etc/pam.d/login
pam_deny.so
ㄱ. 설명: 이 모듈은 접근을 거부하는 데 사용한다. 응용프로그램에게 항상 실패를 리턴한다.
ㄴ. 사용예
a. 모든 계정에 대한 로그인을 막으려면 /etc/pam.d/login이라는 파일에 아래와 같이 설정해 주면 된다.
account required /lib/security/pam_deny.so
b. 응용프로그램이 사용자의 패스워드를 변경하는 것을 막고 login이 예전에 사용하던 패스워
드가 만료되어 새 패스워드를 자동적으로 묻는 것을 막으려면 /etc/pam.d/login이라는 파일
에 아래 내용을 추가한다.
password required /lib/security/pam_deny.so
pam_cracklib.so
ㄱ. 설명: 이 모듈은 password 를 설정한 정책과 비교,검사한다.
ㄴ. 모듈인자
debug
=> 모듈이 동작을 보여주기 위해 syslog에 정보를 남기는데 이 옵션을 사용하면 패스워드정보를 남기지 않는다.
type=LINUX
=> 모듈의 기본 동작은 패스워드를 물어볼 때 "New UNIX password: "라고 묻는데, 이 옵션을 사용하여 'UNIX'라는 말 대신 'LINUX'로 바꿀 수 있다.
retry=N
=> 새 패스워드를 물어보는 횟수로서 기본값은 1이다. 이 옵션을 사용하면 N만큼 횟수를 늘릴 수 있다.
difok=N
=> 새 패스워드에서 예전 패스워드에 있지 않는 문자들을 몇자나 사용해야 하는지 나타내는 수로 기본값은 10이고 새 패스워드에서 1/2이상의 글자가 이전과 다르다면 새 패스워드로 받아들여 진다.
minlen=N
=> 새 패스워드의 최소 크기에 1을 더한 크기이다. 새 패스워드엔 사용된 문자열의 길이외에 각 문자종류(숫자, 대문자, 소문자, 특수문자)를 사용한 것에 대해 각각 크레디트(credit)를 준다.
dcredit=N
=> 숫자문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
ucredit=N
=> 대문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
lcredit=N
=> 소문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
ocredit=N
=> 특수문자가 가질수 있는 크레디트값을 지정한다. 기본값은 1이다.
use_authok
=> 이 인자는 사용자에게 새 패스워드를 묻지말고 앞서 실행된 패스워드모듈에서 받은 것을 사용하도록 모듈에게 강제한다.
ㄷ. minlen값과 크레디트(credit)
이 모듈은 크레디트(credit)라는 것을 사용한다. 만약 minlen=12 이면 실제적으로 보면 최소패스워드의 길이 12가 되어야 한다.
소문자를 사용함으로 1크레디트, 숫자를 사용하여 1크레디트, 특수문자를 사용하여 1크레디트를 얻으므로 도합 3크레디트를 얻는다.
이런 경우 총문자의 길이는 12-3임으로 실제적으로 9자이상이면 가능하다.
pam_wheel.so
ㄱ. 설명: root권한을 얻을 수 있는 사용자를 wheel(gid=0)이라는 그룹으로 묶어서 사용하도록
지원하는 모듈이다.
ㄴ. 모듈인자
debug
=> syslog에 더 많은 정보를 제공한다.
group=그룹명
=> gid=0인 그룹을 검사하는 대신 인증을 위해서 '그룹명'그룹을 검사한다. 여기서 그룹명은 그룹의 이름이지 숫자로 된 그룹의 id가 와서는 안된다.
trust
=> 이 옵션을 사용하면 root권한을 요구한 사용자가 wheel그룹에 속한 경우 PAM_SUCCESS를 돌려주도록 한다. 즉 wheel group에 속한 사용자들은 암호를 입력하지 않고도 root권한을 획득할 수 있게 된다. 주의해서 사용해야 한다.
deny
=> 모듈의 동작을 반대로 하도록 만든다. 만약 사용자가 wheel그룹에 속한 사용자가 uid=0 을 얻기 시도하면 접근을 거부한다. 이 옵션은 단독적으로는 쓸모가 없고 'group='옵션과 같이 사용하기 위해 만들어졌다.
use_uid
=> login할 때의 이름을 이용하지 않고 uid를 이용한다.
ㄷ. 사용된 곳: /etc/pam.d/su
pam_rootok
ㄱ. 설명: 이 모듈은 superuser가 암호입력없이 해당 서비스에 대한 접근을 허용할 때 사용한다.
ㄴ. 사용된 곳
[root@www root]# cat /etc/pam.d/su
#%PAM-1.0
auth sufficient /lib/security/pam_rootok.so
=> root사용자는 기본적으로 접근이 가능하다. 즉, root사용자가 su명령으로 일반사용자로
전환해도 패스워드를 묻지 않는다.
# 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
PAM의 사용예
(1) 특정계정에 대해 telnet 접속은 막고, ftp접속만 허가하도록 해보자.
1) /etc/pam.d/login파일을 열어서 아래라인을 추가한다.
auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/logi
nusers onerr=succeed
2) /etc/loginusers 파일을 만들고 telnet 접속을 막을 계정을 적는다.
[root@www root]# cat /etc/loginusers
prehee
=> prehee 이라는 계정은 텔넷은 사용할 수 없고 ftp만 사용가능하다.
(2) /etc/loginusers파일에 등록된 사용자만 로그인을 허용하도록 해보자
1) /etc/pam.d/login파일을 열어 아래라인을 추가한다.
auth required /lib/security/pam_listfile.so item=user sense=allow file=/etc/logi
nusers onerr=fail
2) /etc/loginusers 파일을 만들고 접속하고자 하는 계정을 한줄에 하나씩 적는다.
(3) 사용자 패스워드 길이 제한하기
1) 설명: 리눅스에서 패스워드 기본설정과 관련된 파일이 /etc/login.defs이다. 이 파일에서 패스
워드의 길이는 최소 5자로 설정하고 있다. 이 파일에서 설정해도 되지만 PAM을 이용하여
패스워드의 길이를 설정할 수 있다. 기본 설정파일은 /etc/pam.d/passwd이다.
2) 설정하기
ㄱ. /etc/pam.d/passwd파일의 기본설정상태
[root@www root]# cat /etc/pam.d/passwd
#%PAM-1.0
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
=> 현재 패스워드관련 정책은 /etc/pam.d/system-auth의 설정을 따른다는 뜻이다.
ㄴ. 패스워드와 관련된 /etc/pam.d/passwd파일의 기본설정상태 확인
[root@www root]# cat /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 /lib/security/pam_env.so
auth sufficient /lib/security/pam_unix.so likeauth nullok
auth required /lib/security/pam_deny.so
account required /lib/security/pam_unix.so
password required /lib/security/pam_cracklib.so retry=3 type=
password sufficient /lib/security/pam_unix.so nullok use_authtok md5 shadow
password required /lib/security/pam_deny.so
session required /lib/security/pam_limits.so
session required /lib/security/pam_unix.so
ㄷ. 패스워드 길이제한을 위한 /etc/pam.d/passwd 파일 수정: 내용중 3번째줄을 삭제하고 아래와
같이 3줄을 추가한다.
[root@www pam.d]# cat /etc/pam.d/passwd
#%PAM-1.0
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
password required /lib/security/pam_cracklib.so retry=3 minlen=12 type=LINUX
password sufficient /lib/security/pam_unix.so nullok use_authok md5 shadow
password required /lib/security/pam_deny.so
=> 현재 기존의 내용을 주석처리하였다. 새로이 설정한 내용은 패스워드를 /etc/pam.d/system-auth파일의 설정을 따르지 않고 새로운 모듈로 설정하였다.
ㄹ. /etc/pam.d/system-auth의 내용수정: 패스워드 관련된 부분을 /etc/pam.d/passwd에서 직접 관여하므로 이 파일에서 password관련 3개의 항목을 제거한다.
[root@www root]# cat /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 /lib/security/pam_env.so
auth sufficient /lib/security/pam_unix.so likeauth nullok
auth required /lib/security/pam_deny.so
account required /lib/security/pam_unix.so
session required /lib/security/pam_limits.so
session required /lib/security/pam_unix.so
3) 테스트
[posein@www posein]$ passwd
Changing password for user posein.
Changing password for posein
(current) UNIX password:
New LINUX password: // LINUX라는 문구열이 보인다.
Retype new LINUX password: // LINUX라는 문구열이 보인다.
Enter new UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully
=> retry=3 으로 설정해서 3번물어본다.
(4) su명령어를 특정사용자에게만 허가하기
1) 설명: PAM서는 특정사용자만 특정한 그룹(보통 wheel)에 속하도록 하여 그 그룹에 속한 사용자만
특정한 권한을 가도록 하기 위해 pam_wheel.so라는 모듈을 제공한다. 또한 리눅스에서는
기본적으로 wheel이라는 그룹이 생성되어 있으므로 이 두가지를 이용하면 된다.
2) 설정하기
ㄱ. /etc/group파일에서 wheel그룹에 su명령어를 사용할 사용자를 추가한다.
예) [root@www root]# cat /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
disk:x:6:root
lp:x:7:daemon,lp
mem:x:8:
kmem:x:9:
wheel:x:10:root,posein // posein이라는 사용자를 추가하였다.
----- 이하생략 -----
ㄴ. /etc/pam.d/su에 아래의 내용을 추가한다.
auth required /lib/security/pam_wheel.so debug group=wheel
예) [root@www root]# cat /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
'개발 플랫폼 및 언어' 카테고리의 다른 글
OS X 설치 APP 을 ISO 파일로 변환하는 방법 (0) | 2022.06.28 |
---|---|
PAM 소스 컴파일 (0) | 2022.04.15 |
NginX 실행시 SELinux 에러에 대한 대처 (0) | 2022.03.24 |
특정 파일을 어디서 찾아 사용하는지 확인하는 방법 (0) | 2022.01.30 |
Git 이미 존재하는 폴더를 새로운 빈 레포지토리에 Push 하는 절차 (0) | 2022.01.09 |