19 분 소요

Pam

• Linux 인증 모듈 PAM(Pluggable Authentication Modules)

  • 응용 프로그램에서 사용자 인증을 수행할 수 있게 공통적인 인증 방법을 제공하는 인증 모듈
  • 인증 모듈의 교체 및 추가/삭제가 용이
  • 개발자가 작성한 코드에 의한 인증이 아닌 시스템 관리자가 직접 응용프로그램의 인증 동작을 제어
    • 응용 프로그램(서비스)에서 PAM을 호출하여 인증 처리 요청
    • 응용 프로그램 개발자가 사용자 인증에 신경 쓰지 않아도 되고, 시스템 관리자가 직접 응용 프로그램 의 인증 동작을 세밀하게 제어 가능
  • 다양한 인증 모듈을 호출하여 사용자 인증 과정을 수행 후 모듈 결과에 맞는 행동을 함
  • 모듈의 종류가 다양하며 인증 절차에 확실한 개념이 필요
  • 라이브러리 형태로 구동(windows 응용 프로그램의 DLL과 같은 라이브러리)
  • 악의적으로 이용할 경우 인증 설정 파일을 이용하여 인증을 수행하지 않고 계정에 접근이 가능


• PAM 동작 원리

  • 프로그램에서 사용자 인증 필요 시 PAM 라이브러리 함수 호출
  • PAM 호출 시 호출한 응용프로그램의 인증 설정 파일 검사
    • 설정 파일이 존재하지 않을 경우 기본 설정 파일(other) 사용
    • 설정 파일은 사용자 인증을 검사하기 위해 필요한 유형을 가지며 이를 기초로 적절한 모듈 호출
    • 구문에 맞는 인증 모듈을 통해 여러 가지 검사 수행
  • 모듈의 인증 결과에 의해 결과 메시지가 결정되어 응용프로그램에 전달


PAM 인증 절차

1) 사용자가 서비스를 이용 받기 위해 접근

  • Local Service : login, gdm, gdm-password, passwd, reboot, setup, su, su-l, sudo, sudo-i, …
  • Remote Service : remote, smtp.postfix, sshd, vsftpd, … 2) 프로세스(로컬, 데몬)은 PAM에 인증 요청 3) PAM은 개별 서비스 인증을 수행하기 위해 요청한 /etc/pam.d 하위에서 요청한 프로세스 이름에 해당하 는 설정 파일 검사 4) 설정 파일의 구문에 의해 PAM 라이브러리 호출 및 결과 메시지 생성 후 프로세스에 반환 5) 프로세스는 반환된 결과에 의해 적절한 행동 수행


PAM 의 영향을 받는 서비스의 목록 : 해당 목록에 없으면 PAM 의 영향을 받지 않는다

2022-10-19-01pam


  1. 프로세스(로컬, 데몬)은 PAM에 인증 요청

  2. PAM은 개별 서비스 인증을 수행하기 위해 요청한 /etc/pam.d 하위에서 요청한 프로세스 이름에 해당하 는 설정 파일 검사

su 를 사용할때 인증 요청 아래파일을 참조에하여 인증을 진행 
vim /etc/pam.d/su

#%PAM-1.0
auth            sufficient      pam_rootok.so
# 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

비슷한 다른파일도 확인 : 비슷함 
vim /etc/pam.d/sshd

#%PAM-1.0
auth       required     pam_sepermit.so
auth       include      password-auth
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth

인증관련모듈 저장 
ls /lib64/security/

pam_access.so        pam_faildelay.so      pam_krb5.so       pam_nologin.so           pam_sepermit.so    pam_unix.so
pam_cap.so           pam_faillock.so       pam_krb5afs.so    pam_oddjob_mkhomedir.so  pam_shells.so      pam_unix_acct.so
pam_chroot.so        pam_filter            pam_lastlog.so    pam_passwdqc.so          pam_smbpass.so     pam_unix_auth.so
pam_ck_connector.so  pam_filter.so         pam_limits.so     pam_permit.so            pam_sss.so         pam_unix_passwd.so
pam_console.so       pam_fprintd.so        pam_listfile.so   pam_postgresok.so        pam_stress.so      pam_unix_session.so
pam_cracklib.so      pam_ftp.so            pam_localuser.so  pam_pwhistory.so         pam_succeed_if.so  pam_userdb.so
pam_debug.so         pam_gnome_keyring.so  pam_loginuid.so   pam_rhosts.so            pam_tally2.so      pam_warn.so
pam_deny.so          pam_group.so          pam_mail.so       pam_rootok.so            pam_time.so        pam_wheel.so
pam_echo.so          pam_issue.so          pam_mkhomedir.so  pam_securetty.so         pam_timestamp.so   pam_winbind.so
pam_env.so           pam_keyinit.so        pam_motd.so       pam_selinux.so           pam_tty_audit.so   pam_xauth.so
pam_exec.so          pam_krb5              pam_namespace.so  pam_selinux_permit.so    pam_umask.so


  1. 설정 파일의 구문에 의해 PAM 라이브러리 호출 및 결과 메시지 생성 후 프로세스에 반환
/etc/pam.d/~ 의 파일에 구성된 순서대로 인증을 진행하고 결과를 프로세스에 성공/실패로 반환한다 


  1. 프로세스는 반환된 결과에 의해 적절한 행동 수행
[ktest@localhost ~]$ su - test01
암호:
su: incorrect password




pam_permit.so

해당 모듈 설명

2022-10-19-02모듈설명


모듈 적용 방식

/etc/pam.d/su

1 #%PAM-1.0
2 auth            sufficient      pam_permit.so (이부분 입니다.)
3 auth            sufficient      pam_rootok.so
4 # Uncomment the following line to implicitly trust users in the "wheel" group.
5 #auth           sufficient      pam_wheel.so trust use_uid
6 # Uncomment the following line to require a user to be in the "wheel" group.
7 #auth           required        pam_wheel.so use_uid
8 auth            include         system-auth
9 account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
10 account         include         system-auth
11 password        include         system-auth
12 session         include         system-auth
13 session         optional        pam_xauth.so


확인

root 제외하고 원래 일반사용자는 su 사용시 root(수퍼유저) 비번 입력 

모듈 적용 전
[ktest@localhost ~]$ su - 
암호:
[root@localhost ~]#

모듈 적용 후
[root@localhost ~]# su - ktest
[ktest@localhost ~]$ su -
[root@localhost ~]#

비밀번호 없이 로그인이 되는 모습 입니다.




pam_deny.so

해당 모듈 설명

2022-10-19-04모듈설명


모듈 적용 방식 (requiste)

vim /etc/pam.d/su

1 #%PAM-1.0
2 #auth           sufficient      pam_permit.so
3 auth            requisite      pam_deny.so (이부분 입니다.)
4 auth            sufficient      pam_rootok.so
5 # Uncomment the following line to implicitly trust users in the "wheel" group.
6 #auth           sufficient      pam_wheel.so trust use_uid
7 # Uncomment the following line to require a user to be in the "wheel" group.
8 #auth           required        pam_wheel.so use_uid
9 auth            include         system-auth
10 account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
11 account         include         system-auth
12 password        include         system-auth
13 session         include         system-auth
14 session         optional        pam_xauth.so


확인

2022-10-19-05확인


모듈 적용 방식 (required)

vim /etc/pam.d/su

1 #%PAM-1.0
2 #auth           sufficient      pam_permit.so
3 auth            required      pam_deny.so (이부분 입니다.)
4 auth            sufficient      pam_rootok.so
5 # Uncomment the following line to implicitly trust users in the "wheel" group.
6 #auth           sufficient      pam_wheel.so trust use_uid
7 # Uncomment the following line to require a user to be in the "wheel" group.
8 #auth           required        pam_wheel.so use_uid
9 auth            include         system-auth
10 account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
11 account         include         system-auth
12 password        include         system-auth
13 session         include         system-auth
14 session         optional        pam_xauth.so


확인

2022-10-19-06확인

정확한 비밀번호를 입력해도 사용자 변경 X


pam_rootok.so

해당 모듈 설명

2022-10-19-07모듈설명


모듈 적용 방식 (sufficient)

/etc/pam.d/su

#%PAM-1.0
auth            sufficient      pam_rootok.so (이부분 입니다.)
# 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

2022-10-19-08모듈설명


모듈 적용 방식 (required)

/etc/pam.d/su

#%PAM-1.0
auth            required        pam_rootok.so(이부분 입니다.)
# 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

2022-10-19-09모듈설명


확인

[root@localhost 바탕화면]# su - ktest
암호:
[ktest@localhost ~]$

[ktest@localhost ~]$ su -
암호:
su: incorrect password




pam_wheel.so

해당 모듈 설명

2022-10-19-10모듈설명


모듈 적용 방식 (sufficient)

/etc/pam.d/su

#%PAM-1.0
auth            sufficient      pam_rootok.so
# 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


확인

2022-10-19-11그룹

사용자    소속그룹
ktest     ktest
test02    wheel

test02 사용자를 새로 생성하면서 소속그룹을 wheel 그룹으로 지정 
[root@localhost pam.d]# useradd test02 -g testgroup
useradd: 'testgroup' 그룹이 없습니다
[root@localhost pam.d]# grep wheel /etc/group
wheel:x:10:

[root@localhost pam.d]# useradd test02 -g wheel

[root@localhost pam.d]# grep test02 /etc/passwd
test02:x:502:10::/home/test02:/bin/bash

[root@localhost pam.d]# tail -1 /etc/passwd
test02:x:502:10::/home/test02:/bin/bash

[root@localhost pam.d]# grep ktest /etc/passwd
ktest:x:500:500::/home/ktest:/bin/bash

[root@localhost pam.d]# grep 500 /etc/group
ktest:x:500:


pam_rootok 의 영향 
[root@localhost pam.d]# su -
[root@localhost ~]# su - test01
[test01@localhost ~]$

pam_wheel.so 에 모듈실패(sufficient) , 비밀번호 맞으면 su 서비스 성공 
[ktest@localhost ~]$ su -
암호:
[root@localhost ~]#

pam_wheel.so 에 모듈성공 (sufficient)  비밀번호 입력없이 su 서비스 성공 
[test02@localhost ~]$ su -
[root@localhost ~]#


모듈 적용 방식 (required)

/etc/pam.d/su

#%PAM-1.0
auth            sufficient      pam_rootok.so
# 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_rootok 의 영향 
[root@localhost ~]# su - ktest
[ktest@localhost ~]$

pam_wheel.so 에 모듈실패(required) , 비밀번호 맞으면 su 서비스 실패
[ktest@localhost ~]$ su -
암호:
su: incorrect password

test02
[test02@localhost ~]$ su -
암호:




pam_succeed_if.so

해당 모듈 설명

2022-10-19-12모듈설명


모듈 적용 방식 (sufficient)

/etc/pam.d/su

#%PAM-1.0
auth            sufficient      pam_rootok.so
auth            sufficient      pam_succeed_if.so user = ktest
# 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


확인

test01 기준 테스트 
test01 에서 su > test02
[test01@localhost ~]$ su - test02
암호:
[test02@localhost ~]$

test01 에서 su > ktest
[test01@localhost ~]$ su - ktest
[ktest@localhost ~]$

test01 에서 su > root
[test01@localhost ~]$ su -
암호:
[root@localhost ~]#

test02 기준 테스트 
[test02@localhost ~]$ su -
암호:
[root@localhost ~]# exit
logout
[test02@localhost ~]$ su - ktest
[ktest@localhost ~]$ exit
logout
[test02@localhost ~]$ su - test01
암호:
[test01@localhost ~]$


모듈 적용 방식 (required)

#%PAM-1
auth            sufficient      pam_rootok.so
#auth           sufficient      pam_succeed_if.so user = ktest 
auth            required        pam_succeed_if.so user = ktest use_uid  (이부분 입니다.)
# 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

use_uid: (사용자의 ID) 로그인한 사용자 ktest 인경우만 적용 , quiet : /var/log/secure에 log 남기지 말것


확인

su 대상 ktest
[test01@localhost ~]$ su -
암호:
su: incorrect password
[test01@localhost ~]$ su - ktest
암호:
su: incorrect password

su 를 시도 하는 사용자가 ktest 
[ktest@localhost ~]$ su -
암호:
[root@localhost ~]# exit
logout
[ktest@localhost ~]$ su - test02
암호:
[test02@localhost ~]$

로그확인
grep pam /var/log/secure
Oct 21 00:56:51 localhost su: pam_succeed_if(su-l:auth): requirement "user = ktest" was met by user "ktest"

다시 한번 테스트 하여 quiet  확인
ktest 로 su  시도 한다음 로그 남는지 확인
grep pam /var/log/secure




pam_access.so

구성도

2022-10-19-18구성도


해당 모듈 설명

2022-10-19-13모듈설명


모듈 적용 방식 (required)

vim /etc/pam.d/sshd

#%PAM-1.0
auth       required     pam_sepermit.so
auth       include      password-auth
account    required     pam_access.so
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth


추가 설정

vim /etc/security/access.conf

맨 마지막에
- ALL : ALL 추가


확인

xp -> putty

2022-10-19-14푸티


host -> mobaxterm

2022-10-19-15모박스텀

둘다 연결 실패


추가 설정

vim /etc/security/access.conf

# All other users should be denied to get access from all sources.
+ : ktest : ALL
- : ALL : ALL

+ : ktest : ALL 추가 해주시면 됩니다.


xp -> putty

2022-10-19-17푸티


host -> mobaxterm

2022-10-19-16모박스텀

둘다 연결 성공 입니다.


추가설정 : ktest 는 XP에서만 접속 가능

vim /etc/security/access.conf

# All other users should be denied to get access from all sources.
+ : ktest : 172.16.0.100
- : ALL : ALL


xp -> putty

2022-10-19-17푸티


host -> mobaxterm

2022-10-19-15모박스텀

xp에서는 성공 했으나 host에서는 실패한 모습 입니다.




pam_time.so

구성도, 설명

2022-10-19-22구성도


모듈 적용 방식 (required)

vim /etc/pam.d/sshd

#%PAM-1.0
auth       required     pam_sepermit.so
auth       include      password-auth
#account           required     pam_access.so
account    required     pam_time.so    (이부분 입니다.)
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth


추가 설정 : time.conf

vim /etc/security/time.conf

sshd;*;root;!We1500-1600

sshd로 들어오는 root 사용자를 수요일 15:00~16:00 시간에만 막아라.


날짜 변경 후 확인(수요일 15시로 변경)

2022-10-19-21날짜변경

2022-10-19-20모박스텀


날짜 변경 후 확인(현재로 변경)

2022-10-19-23날짜

2022-10-19-24모박스텀

수요일 특정 시간대만 막히고 다른 날에는 다 잘되는 모습 입니다.




pam_listfile.so

해당 모듈 설명

2022-10-19-25모듈설명


모듈 적용 (white list)

vim /etc/pam.d/sshd

사용자 허용 /etc/white_list /etc/white_list파일없으면실패 <- 추가 할 내용
#%PAM-1.0
auth       required     pam_listfile.so item=user sense=allow file=/etc/white_list onerr=fail  (이부분 입니다.)
auth       required     pam_sepermit.so
auth       include      password-auth
#account    required    pam_access.so
#account    required    pam_time.so
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth


추가 설정

vim /etc/white_list   파일을 만들고

ktest                 << 내용 추가


확인

host -> ssh ktest 접속, ssh root 접속, ssh test01 접속

2022-10-19-26확인

ktest만 성공하고 나머지는 실패 했습니다.


white_list 파일이 없는 상황 확인해 보기

2022-10-19-27확인

확인 file=/etc/white_list onerr=fail file=파일명 없다면 모듈 실패 > required 실패 > 아무리 비번 잘 입력해도 > sshd 서비스 실패


모듈 적용 (black list)

vim /etc/pam.d/sshd

#%PAM-1.0
#auth      required     pam_listfile.so item=user sense=allow file=/etc/white_list onerr=fail
auth       required     pam_listfile.so item=user sense=deny file=/etc/black_list onerr=succeed   (이부분 입니다.)
auth       required     pam_sepermit.so
auth       include      password-auth
#account    required    pam_access.so
#account    required    pam_time.so
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth


추가 설정

vim /etc/black_list       파일 만들고
ktest                     << 내용 추가


확인

2022-10-19-28확인


black_list 파일이 없는 상황 확인해 보기

2022-10-19-29확인




pam_unix.so

해당 모듈 설명

2022-10-19-30모듈설명


모듈 적용

vim /etc/pam.d/passwd

passwd : 비밀번호 설정 명령어
# vim /etc/pam.d/passwd 
%PAM-1.0
auth       include      system-auth
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so

include : 다른파일에 내용있음 

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

vim /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_fprintd.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_localuser.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 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=3(이전암호 기억)
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

------------------------------------------
vim /etc/security/opasswd

현재는 내용이 없음

/etc/pam.d/passwd 
~
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=3(이전암호 기억) 을 추가후 ktest 로 로그인 하여 비밀번호를 변경후 파일에 기록되는지 확인 (3번정도는 변경해볼것)


확인

2022-10-19-31확인

remember=3(이전암호 기억) 부분의 영향으로 해쉬값이 점점 증가하는 모습 입니다.

4번째 변경

2022-10-19-32확인

3번째 까지만 저장이 되도록 설정을 해놧기 때문에 첫번째 해쉬값이 사라진 모습 입니다.




pam_cracklib.so

해당 모듈 설명

2022-10-19-33모듈설명


비밀번호 사전

[ktest@localhost ~]$ passwd
ktest 사용자의 비밀 번호 변경 중
ktest에 대한 암호 변경 중
(현재) UNIX 암호:
새  암호:test7575
잘못된 암호: 사전에 있는 단어를 기반으로 합니다

[ktest@localhost ~]$ passwd
ktest 사용자의 비밀 번호 변경 중
ktest에 대한 암호 변경 중
(현재) UNIX 암호:
새  암호:test7575
잘못된 암호: 사전에 있는 단어를 기반으로 합니다

사전에 있는 단어를 어디서 ? 
# find /  -name crack*
/usr/lib64/cracklib_dict.pwi
/usr/lib64/cracklib_dict.hwm
/usr/lib64/cracklib_dict.pwd


비밀번호 변경 횟수를 제한

vim /etc/pam.d/system-auth

password    requisite     pam_cracklib.so try_first_pass retry=3 (비밀번호 변경 재입력 횟수)type=

비밀번호 변경 재입력 허용 횟수 변경 
[ktest@localhost ~]$ passwd
ktest 사용자의 비밀 번호 변경 중
ktest에 대한 암호 변경 중
(현재) UNIX 암호:
새  암호:
잘못된 암호: 다른 문자가 충분히 포함되어 있지 않습니다
새  암호:
잘못된 암호: 다른 문자가 충분히 포함되어 있지 않습니다
새  암호:
잘못된 암호: 다른 문자가 충분히 포함되어 있지 않습니다
암호:
passwd: 서비스를 최대로 재시도함

비밀번호 변경 재입력 허용 횟수 변경 
# vim /etc/pam.d/system-auth
~
password    requisite     pam_cracklib.so try_first_pass retry=4 (비밀번호 변경 재입력 횟수)type=

ktest에 대한 암호 변경 중
(현재) UNIX 암호:
새  암호:
잘못된 암호: 다른 문자가 충분히 포함되어 있지 않습니다
새  암호:
잘못된 암호: 너무 짧습니다
새  암호:
잘못된 암호: 다른 문자가 충분히 포함되어 있지 않습니다
새  암호:
잘못된 암호: 다른 문자가 충분히 포함되어 있지 않습니다
암호:


비밀번호 길이 ,포함된 문자,숫자 …

minlen : 암호 최소 길이
dcredit : 암호 숫자 필요 (-1 : 무조건 하나 포함 , 기타숫자는 필요한 갯수) 
ucredit : 암호 영문 대문자 필요 (-1 : 무조건 하나 포함 , 기타숫자는 필요한 갯수) 
lcredit : 암호 영문 소문자 필요 (-1 : 무조건 하나 포함 , 기타숫자는 필요한 갯수) 
ocredit : 암호 특수문자 필요    (-1 : 무조건 하나 포함 , 기타숫자는 필요한 갯수) 

-------------------------------------------------
passwd 명령어로 test 사용자가 암호 변경시 복잡도 설정

vim /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_fprintd.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_localuser.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 type= minlen=10  (이부분 입니다.)
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=3
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


확인

8글자 비번변경
호랑1234 비밀번호 변경 됨
호랑임   비밀번호 변경 안됨

9글자 비번변경
강당112  비밀번호 변경 됨
강당공   비밀번호 변경 안됨

minlen=10
credit : 암호 최소화 길이를 결정하는 요소
d,u,l,o 

소문자로만 이루어졌다 credit 1이 감소
minlen=10 - lcredit 1 = 9글자
rladudwo 	(X) 
rladudwos  	(O)

소문자,숫자 	      credit 2가 감소
minlen=10 - lcredit 1,dcredit1 = 8글자


소문자,숫자,대문자,특수문자  credit 4 감소
minlen=10 - lcredit 1,dcredit 1,ocredit 1, ucredit 1 = 6글자

ku@A2  (X)
equ@A2 (O)

credit -1 들어간다는 것은 의무적으로 포함 되어야 한다 
password    requisite     pam_cracklib.so try_first_pass retry=3 type= minlen=10 dcredit=-1

비밀번호를 숫자로만 입력 
903190339
test01에 대한 암호 변경 중
(현재) UNIX 암호:
새  암호:
잘못된 암호: 다른 문자가 충분히 포함되어 있지 않습니다
새  암호:

dcredit=-1 ucredit=-1 ocredit=-1 : 최소 7글자(3credit) 에  숫자,대문자,특수문자 필수 
password    requisite     pam_cracklib.so try_first_pass retry=3 type= minlen=10 dcredit=-1 ucredit=-1 ocredit=-1

guaoluytq 
다른 문자가 충분히 포함되어 있지 않습니다

guaolyt1
잘못된 암호: 너무 짧습니다

Guaolyt1
잘못된 암호: 너무 간단함

Gu@aolyt1
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.

설명)
최소 10글자 대/소/숫/특 
6 
dcredit -1 이 붙으면 무조검 표기 해야하는 의무가 +1 -1 
ocredit -1 이 붙으면 무조검 표기 해야하는 의무가 +1 -1 
ucredit -1 이 붙으면 무조검 표기 해야하는 의무가 +1 -1 




pam_motd.so , pam_issue.so

모듈 설명

2022-10-19-35모듈설명


모듈 설정 - telnet server service 설정

yum -y install telnet-server 설치

설정파일 수정
# vim /etc/xinetd.d/telnet

# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no      (yes -> no로 수정)
}

telnet 서비스를 제어하는 수퍼데몬 재시작
service xinetd restart


서비스 확인

vim /etc/motd 

KH12 Server             << 추가

2022-10-19-37텔넷


모듈 설정

설정에 필요한 motd file 생성

vim /etc/motd2

/etc/motd2 test file   << 내용 추가

----------------------------------------------
vim /etc/pam.d/login

  1 #%PAM-1.0
  2 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
  3 auth       include      system-auth
  4 account    required     pam_nologin.so
  5 account    include      system-auth
  6 password   include      system-auth
  7 # pam_selinux.so close should be the first session rule
  8 session    required     pam_selinux.so close
  9 session    required     pam_loginuid.so
 10 session    optional     pam_console.so
 11 # pam_selinux.so open should only be followed by sessions to be executed in the user context
 12 session    required     pam_selinux.so open
 13 session    required     pam_namespace.so
 14 session    optional     pam_keyinit.so force revoke
 15 session    optional     pam_motd.so motd=/etc/motd2          << 추가
 16 session    include      system-auth
 17 -session   optional     pam_ck_connector.so
 
optional : 해당 모듈은 서비스 성공/실패 와 관련이 없을때 , 성공/실패 메시지 무시


tui 모드 console 로 테스트

2022-10-19-39확인


gui 모드 테스트

 vim /etc/pam.d/gdm-password
 
 1 auth     [success=done ignore=ignore default=bad] pam_selinux_permit.so
  2 auth        substack      password-auth
  3 auth        optional      pam_gnome_keyring.so
  4 
  5 account     required      pam_nologin.so
  6 account     include       password-auth
  7 
  8 password    substack      password-auth
  9 password    optional      pam_gnome_keyring.so
 10 
 11 session     required      pam_selinux.so close
 12 session     required      pam_loginuid.so
 13 session     required      pam_motd.so motd=/etc/motd2           << 추가
 14 session     optional      pam_console.so
 15 session     required      pam_selinux.so open
 16 session     optional      pam_keyinit.so force revoke
 17 session     required      pam_namespace.so
 18 session     optional      pam_gnome_keyring.so auto_start
 19 session     include       password-auth
 -------------------------------------------------
  vim /etc/pam.d/gdm
  
  1 #%PAM-1.0
  2 auth     [success=done ignore=ignore default=bad] pam_selinux_permit.so
  3 auth       required    pam_succeed_if.so user != root quiet
  4 auth       required    pam_env.so
  5 auth       substack    system-auth
  6 auth       optional    pam_gnome_keyring.so
  7 account    required    pam_nologin.so
  8 account    include     system-auth
  9 password   include     system-auth
 10 session    required    pam_selinux.so close
 11 session    required    pam_loginuid.so
 12 session    optional    pam_console.so
 13 session    optional    pam_motd.so motd=/etc/motd2            << 추가
 14 session    required    pam_selinux.so open
 15 session    optional    pam_keyinit.so force revoke
 16 session    required    pam_namespace.so
 17 session    optional    pam_gnome_keyring.so auto_start
 18 session    include     system-auth

gui 모드는 로그인 할때 순식간에 지나가기 때문에 잘 보셔야 합니다.

2022-10-19-40확인




root 를 이용한 모든 접근을 차단
서비스 
/etc/pam.d/login         CLI(콘솔) 접근 (run-level : init 3)
/etc/pam.d/gdm-password  GUI 접근       (run-level : init 5)
/etc/pam.d/sshd          sshd  접근

root 가 아닌경우 모두 모듈 성공 
auth required pam_succeed_if.so user != root  << 이 내용을 다 추가해주시면 됩니다. 

2022-10-19-41init3

2022-10-19-42init5




PAM 을 이용한 google OTP

이번에는 centOS_7을 사용 하겠습니다.

google OTP 휴대폰에 설치

2022-10-19-43otp

OTP(OneTimePassword)

  • 1회용 비밀번호
  • 하드웨어 / 소프트웨어
  • 정해진 암호가 아닌 특정 알고리즘에 의해 수시로 생성되는 비밀번호
  • 많이 사용하는 방식은 시간동기화
    • 임의 비밀번호를 생성하기위해선 랜덤하게 적용할 값
    • 주로 현재 시간이 주 요소 됨
    • 시간문제 때문에 인증이 안되는경우가 있어 OTP 생성시 간격을 1~2분 여유

2 Factor 인증

  • google-autheticator + 일반 비밀번호


환경 설정

sestatus 확인

2022-10-19-44sestatus

yum -y install google-authenticator  << 설치

centOS 패키지 저장소가 없어서 설치가 안되시는 분들은
yum -y install epel-release   << 먼저 설치 하신 후

ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-Media.repo    CentOS-fasttrack.repo      epel.repo
CentOS-CR.repo         CentOS-Sources.repo  CentOS-x86_64-kernel.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo    epel-testing.repo
epel-repo 2개가 잘 설치 되었는지 확인 후

yum repolist << 설치 한 다음에

yum -y install google-authenticator << 설치 하시면 됩니다.

ls /lib64/security/
pam_access.so     pam_gdm.so                   pam_nologin.so           pam_systemd.so
pam_cap.so        pam_gnome_keyring.so         pam_oddjob_mkhomedir.so  pam_tally2.so
pam_chroot.so     pam_google_authenticator.la  pam_permit.so            pam_time.so
pam_console.so    pam_google_authenticator.so  pam_postgresok.so        pam_timesta

설치가 잘 되었는지 확인 해 주시면 됩니다.

--------------------------------------------
모듈 설정
vim /etc/pam.d/sshd

auth       required     pam_google_authenticator.so nullok   << auth 내용 맨 밑에 추가

---------------------------------------------
sshd 설정 파일 수정
vim /etc/ssh/sshd_config

64 #PermitEmptyPasswords no
65 PermitEmptyPasswords yes
66 #PasswordAuthentication yes
67 PasswordAuthentication no
68 
69 # Change to no to disable s/key passwords
70 #ChallengeResponseAuthentication yes
71 #ChallengeResponseAuthentication no
72 ChallengeResponseAuthentication yes

systemctl restart sshd 까지 해주시면 됩니다.


인증 설정

2022-10-19-46실행

qr코드를 휴대폰에 설치했던 app을 통해 찍으시면 됩니다.

관련 정보 업데이트 
Do you want me to update your "/root/.google_authenticator" file? (y/n)y


중간자 공격 방지를 위해 30초에 한번 로그인 제한
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n)

By default, a new token is generated every 30 seconds by the mobile app.
In order to compensate for possible time-skew between the client and the server,
we allow an extra token before and after the current time. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) y

매 30초 마다 3번 허용 
If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting? (y/n) y

시간 동기화
# rdate -s time.bora.net

서비스 재시작
# systemctl restart sshd


테스트 -> mobaxterm으로 접속 시도

2022-10-19-49실행




admin group 의 구성원만 su 를 사용하여 root 로 전환 할수 있게 하기

이번에는 centOS_6 사용 하겠습니다.

su 테스트

2022-10-19-50su확인


모듈 설정

vim /etc/pam.d/su

auth            sufficient      pam_succeed_if.so user ingroup admin use_uid        << 내용 추가


test02 사용자의 2차 그룹을 admin으로 설정

[root@localhost ~]# usermod test02 -G admin

소속 group 확인
[root@localhost ~]# grep test02 /etc/group
admin:x:40008:test02
[root@localhost ~]# groups test02
test02 : wheel admin


test02, test03 비교

2022-10-19-52su확인

admin group에 속해있는 test02는 비밀번호 없이 root로 login 되고 admin group에 속해있지 않은 test03은 비밀번호를 입력해야 login이 가능 합니다.


업데이트:

댓글남기기