Post

[Linux] πŸ” pam_tally2둜 둜그인 μ‹€νŒ¨ μ œν•œ 및 계정 잠금 μ„€μ •ν•˜κΈ°

[Linux] πŸ” pam_tally2둜 둜그인 μ‹€νŒ¨ μ œν•œ 및 계정 잠금 μ„€μ •ν•˜κΈ°

λ¦¬λˆ…μŠ€ μ„œλ²„μ—μ„œ λΉ„λ°€λ²ˆν˜Έλ₯Ό λ¬΄ν•œ 반볡 μ‹œλ„ν•˜λŠ” 브루트포슀(Brute-force) 곡격은 κ°€μž₯ κΈ°μ΄ˆμ μ΄λ©΄μ„œλ„ λΉˆλ²ˆν•œ μœ„ν˜‘μž…λ‹ˆλ‹€. PAM(Pluggable Authentication Modules) 의 pam_tally2 λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ 둜그인 μ‹€νŒ¨ 횟수λ₯Ό μΆ”μ ν•˜κ³ , μž„κ³„κ°’ 초과 μ‹œ 계정을 μžλ™μœΌλ‘œ μž κΈ€ 수 μžˆμŠ΅λ‹ˆλ‹€.

⚠️ pam_tally2λŠ” Deprecated μƒνƒœμž…λ‹ˆλ‹€. RHEL 8 / CentOS 8 이상 λ˜λŠ” μ΅œμ‹  Ubuntu ν™˜κ²½μ—μ„œλŠ” pam_faillock을 μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€. 이 ν¬μŠ€νŠΈλŠ” 두 κ°€μ§€ λͺ¨λ‘ λ‹€λ£Ήλ‹ˆλ‹€.


🧩 PAMμ΄λž€?

PAM은 λ¦¬λˆ…μŠ€μ˜ 인증 ν”„λ ˆμž„μ›Œν¬λ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 인증 방식을 직접 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ λ˜λ„λ‘ λͺ¨λ“ˆ λ°©μ‹μœΌλ‘œ 인증 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. /etc/pam.d/ 디렉토리 μ•„λž˜μ— μ„œλΉ„μŠ€λ³„ μ„€μ • 파일이 μœ„μΉ˜ν•©λ‹ˆλ‹€.

1
2
3
4
5
/etc/pam.d/
β”œβ”€β”€ sshd           # SSH μ„œλΉ„μŠ€ 인증 μ„€μ •
β”œβ”€β”€ login          # 둜컬 μ½˜μ†” 둜그인 인증 μ„€μ •
β”œβ”€β”€ password-auth  # νŒ¨μŠ€μ›Œλ“œ 기반 인증 곡톡 μ„€μ • (RHEL/CentOS)
└── system-auth    # μ‹œμŠ€ν…œ 인증 곡톡 μ„€μ • (RHEL/CentOS)

PAM 섀정은 4κ°€μ§€ νƒ€μž…(auth, account, password, session)으둜 κ΅¬μ„±λ˜λ©°, pam_tally2λŠ” 주둜 auth와 account νƒ€μž…μ— μ μš©λ©λ‹ˆλ‹€.


πŸ”’ pam_tally2 μ„€μ •ν•˜κΈ° (RHEL 7 / CentOS 7)

/etc/pam.d/password-auth μ„€μ •

SSH 둜그인 μ‹€νŒ¨ μ œν•œμ„ μ μš©ν•˜λ €λ©΄ μ•„λž˜μ™€ 같이 μ„€μ •ν•©λ‹ˆλ‹€.

1
2
3
4
5
6
7
8
9
10
11
# /etc/pam.d/password-auth

auth        required      pam_tally2.so deny=5 unlock_time=1800 no_magic_root reset
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_tally2.so no_magic_root
account     required      pam_unix.so
account     sufficient    pam_localuser.so

/etc/pam.d/system-auth μ„€μ •

둜컬 μ½˜μ†” λ‘œκ·ΈμΈμ—λ„ λ™μΌν•˜κ²Œ μ μš©ν•˜λ €λ©΄ system-auth νŒŒμΌμ—λ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

1
2
3
4
5
# /etc/pam.d/system-auth

auth        required      pam_tally2.so deny=5 unlock_time=1800 no_magic_root reset
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass

Tip: password-authλŠ” SSH λ“± 원격 접속, system-authλŠ” 둜컬 μ½˜μ†” 접속에 μ μš©λ©λ‹ˆλ‹€. 두 파일 λͺ¨λ‘ μˆ˜μ •ν•΄μ•Ό μ™„μ „ν•œ 적용이 λ©λ‹ˆλ‹€.


βš™οΈ μ£Όμš” μ˜΅μ…˜ μ„€λͺ…

μ˜΅μ…˜μ„€λͺ…
deny=NN회 μ‹€νŒ¨ μ‹œ 계정 잠금 (예: deny=5λŠ” 5회 μ‹€νŒ¨ μ‹œ 잠금)
unlock_time=NN초 ν›„ μžλ™ 잠금 ν•΄μ œ (예: unlock_time=1800은 30λΆ„). μƒλž΅ μ‹œ 영ꡬ 잠금
no_magic_rootroot 계정은 잠금 λŒ€μƒμ—μ„œ μ œμ™Έ
reset둜그인 성곡 μ‹œ μ‹€νŒ¨ 횟수λ₯Ό 0으둜 μ΄ˆκΈ°ν™”
onerr=failPAM λͺ¨λ“ˆ 였λ₯˜ λ°œμƒ μ‹œ 인증 μ‹€νŒ¨λ‘œ 처리
even_deny_rootroot 계정도 잠금 λŒ€μƒμ— 포함 (λ³΄μ•ˆ κ°•ν™” μ‹œ μ‚¬μš©)

πŸ› οΈ pam_tally2 λͺ…λ Ήμ–΄ μ‚¬μš©λ²•

μ‹€νŒ¨ 횟수 쑰회

1
pam_tally2 -u [계정λͺ…]
1
2
3
4
# μ˜ˆμ‹œ
pam_tally2 -u testuser
# Login           Failures Latest failure     From
# testuser            5    04/26/26 10:30:00  192.168.1.100

계정 잠금 ν•΄μ œ (μ‹€νŒ¨ 횟수 μ΄ˆκΈ°ν™”)

1
pam_tally2 -u [계정λͺ…] -r
1
2
3
4
# μ˜ˆμ‹œ
pam_tally2 -u testuser -r
# Login           Failures Latest failure     From
# testuser            0

-r (--reset) μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ‹€νŒ¨ νšŸμˆ˜κ°€ 0으둜 μ΄ˆκΈ°ν™”λ˜μ–΄ μ¦‰μ‹œ 잠금이 ν•΄μ œλ©λ‹ˆλ‹€.

전체 계정 μ‹€νŒ¨ ν˜„ν™© 쑰회

1
pam_tally2

μ˜΅μ…˜ 없이 μ‹€ν–‰ν•˜λ©΄ 둜그인 μ‹€νŒ¨ 이λ ₯이 μžˆλŠ” λͺ¨λ“  계정 λͺ©λ‘μ„ 좜λ ₯ν•©λ‹ˆλ‹€.


πŸ”Ž μ„€μ • 적용 확인

계정이 μ‹€μ œλ‘œ μž κ²ΌλŠ”μ§€ ν…ŒμŠ€νŠΈν•˜λ €λ©΄ μ•„λž˜ μˆœμ„œλ‘œ ν™•μΈν•©λ‹ˆλ‹€.

1
2
3
4
5
6
7
8
9
# 1. ν…ŒμŠ€νŠΈ 계정 잠금 유발 (5회 ν‹€λ¦° νŒ¨μŠ€μ›Œλ“œ μž…λ ₯ ν›„)
ssh testuser@localhost  # 5회 μ‹€νŒ¨

# 2. 잠금 μƒνƒœ 확인
pam_tally2 -u testuser
# Failures: 5 (이상이면 잠금 μƒνƒœ)

# 3. κ΄€λ¦¬μžκ°€ μˆ˜λ™μœΌλ‘œ 잠금 ν•΄μ œ
pam_tally2 -u testuser -r

⚠️ root κ³„μ •μœΌλ‘œ pam_tally2 -r λͺ…령을 μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 일반 κ³„μ •μœΌλ‘œ μ‹€ν–‰ μ‹œ κΆŒν•œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.


πŸ†• μ΅œμ‹  λŒ€μ•ˆ: pam_faillock (RHEL 8 / CentOS 8 이상)

pam_tally2λŠ” RHEL 8λΆ€ν„° 곡식 Deprecated μ²˜λ¦¬λ˜μ—ˆκ³ , pam_faillock 이 λŒ€μ²΄ λͺ¨λ“ˆμž…λ‹ˆλ‹€. μ‚¬μš©λ²•μ€ μœ μ‚¬ν•˜μ§€λ§Œ μ„€μ • 방식이 λ‹€λ¦…λ‹ˆλ‹€.

/etc/pam.d/sshd μ„€μ •

1
2
3
4
5
auth    required      pam_faillock.so preauth silent audit deny=5 unlock_time=600
auth    [success=1 default=bad] pam_unix.so nullok
auth    [default=die] pam_faillock.so authfail audit deny=5 unlock_time=600
auth    sufficient    pam_faillock.so authsucc audit deny=5 unlock_time=600
account required      pam_faillock.so

pam_faillock λͺ…λ Ήμ–΄

1
2
3
4
5
# μ‹€νŒ¨ 횟수 쑰회
faillock --user [계정λͺ…]

# 계정 잠금 ν•΄μ œ
faillock --user [계정λͺ…] --reset

pam_tally2 vs pam_faillock 비ꡐ

ν•­λͺ©pam_tally2pam_faillock
지원 OSRHEL 6~7, ꡬ버전RHEL 8+, μ΅œμ‹  Ubuntu
μƒνƒœDeprecatedν˜„μž¬ ꢌμž₯
λͺ…λ Ήμ–΄pam_tally2 -ufaillock --user
잠금 ν•΄μ œpam_tally2 -u USER -rfaillock --user USER --reset
μ„€μ • λ³΅μž‘λ„λ‹¨μˆœλ‹€μ†Œ 볡작

βœ… μš”μ•½

  1. pam_tally2λŠ” /etc/pam.d/password-auth 및 system-auth에 auth required와 account required 두 쀄씩 μΆ”κ°€ν•©λ‹ˆλ‹€.
  2. deny=5 unlock_time=1800 no_magic_root reset이 κ°€μž₯ 일반적인 μ„€μ •μž…λ‹ˆλ‹€.
  3. 계정 잠금 ν•΄μ œλŠ” pam_tally2 -u [계정λͺ…] -r둜 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  4. RHEL 8 / CentOS 8 이상 ν™˜κ²½μ—μ„œλŠ” pam_faillockκ³Ό faillock λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.
This post is licensed under CC BY 4.0 by the author.