리λ
μ€ μλ²μμ λΉλ°λ²νΈλ₯Ό 무ν λ°λ³΅ μλνλ λΈλ£¨νΈν¬μ€(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=N | Nν μ€ν¨ μ κ³μ μ κΈ (μ: deny=5λ 5ν μ€ν¨ μ μ κΈ) |
unlock_time=N | Nμ΄ ν μλ μ κΈ ν΄μ (μ: unlock_time=1800μ 30λΆ). μλ΅ μ μꡬ μ κΈ |
no_magic_root | root κ³μ μ μ κΈ λμμμ μ μΈ |
reset | λ‘κ·ΈμΈ μ±κ³΅ μ μ€ν¨ νμλ₯Ό 0μΌλ‘ μ΄κΈ°ν |
onerr=fail | PAM λͺ¨λ μ€λ₯ λ°μ μ μΈμ¦ μ€ν¨λ‘ μ²λ¦¬ |
even_deny_root | root κ³μ λ μ κΈ λμμ ν¬ν¨ (보μ κ°ν μ μ¬μ©) |
π οΈ 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
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_tally2 | pam_faillock |
|---|
| μ§μ OS | RHEL 6~7, ꡬλ²μ | RHEL 8+, μ΅μ Ubuntu |
| μν | Deprecated | νμ¬ κΆμ₯ |
| λͺ
λ Ήμ΄ | pam_tally2 -u | faillock --user |
| μ κΈ ν΄μ | pam_tally2 -u USER -r | faillock --user USER --reset |
| μ€μ 볡μ‘λ | λ¨μ | λ€μ λ³΅μ‘ |
β
μμ½
pam_tally2λ /etc/pam.d/password-auth λ° system-authμ auth requiredμ account required λ μ€μ© μΆκ°ν©λλ€.deny=5 unlock_time=1800 no_magic_root resetμ΄ κ°μ₯ μΌλ°μ μΈ μ€μ μ
λλ€.- κ³μ μ κΈ ν΄μ λ
pam_tally2 -u [κ³μ λͺ
] -rλ‘ μνν©λλ€. - RHEL 8 / CentOS 8 μ΄μ νκ²½μμλ
pam_faillockκ³Ό faillock λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμΈμ.