66
77#
88# 9.2.11 Set deny times for Password Attempts (Scored)
9+ # Replaced pam_tally2 with pam_faillock in debian 11
910# The number in the original document is 9.2.2
1011# for login and ssh service
1112# Author : Samson wen, Samson <sccxboy@gmail.com>
@@ -17,30 +18,27 @@ set -u # One variable unset, it's over
1718HARDENING_LEVEL=3
1819
1920PACKAGE=' libpam-modules-bin'
20- PAMLIBNAME=' pam_tally2.so'
21- AUTHPATTERN=' ^auth[[:space:]]*required[[:space:]]*pam_tally2.so'
2221AUTHFILE=' /etc/pam.d/common-auth'
23- AUTHRULE=' auth required pam_tally2.so deny=3 even_deny_root unlock_time=900'
2422ADDPATTERNLINE=' # pam-auth-update(8) for details.'
2523DENYOPTION=' deny'
2624DENY_VAL=3
2725
2826# This function will be called if the script status is on enabled / audit mode
29- audit () {
27+ audit_before11 () {
3028 is_pkg_installed $PACKAGE
3129 if [ $FNRET != 0 ]; then
3230 crit " $PACKAGE is not installed!"
33- FNRET=1
31+ FNRET=11
3432 else
3533 ok " $PACKAGE is installed"
3634 does_pattern_exist_in_file $AUTHFILE $AUTHPATTERN
3735 if [ $FNRET = 0 ]; then
3836 ok " $AUTHPATTERN is present in $AUTHFILE ."
39- check_param_pair_by_pam $AUTHFILE $PAMLIBNAME $DENYOPTION le $DENY_VAL
37+ check_param_pair_by_pam $AUTHFILE $PAMLIBNAME $DENYOPTION le $DENY_VAL
4038 if [ $FNRET = 0 ]; then
41- ok " $DENYOPTION set condition is less-than-or-equal-to $DENY_VAL "
39+ ok " $DENYOPTION set condition is less-than-or-equal-to $DENY_VAL "
4240 else
43- crit " $DENYOPTION set condition is not $DENY_VAL "
41+ crit " $DENYOPTION set condition is not $DENY_VAL "
4442 fi
4543 else
4644 crit " $AUTHPATTERN is not present in $AUTHFILE "
@@ -49,11 +47,45 @@ audit () {
4947 fi
5048}
5149
52- # This function will be called if the script status is on enabled mode
53- apply () {
50+ audit_debian11 () {
51+ is_pkg_installed $PACKAGE
52+ if [ $FNRET != 0 ]; then
53+ crit " $PACKAGE is not installed!"
54+ FNRET=11
55+ else
56+ ok " $PACKAGE is installed"
57+ does_pattern_exist_in_file $AUTHFILE $AUTHPATTERN
58+ if [ $FNRET = 0 ]; then
59+ ok " $AUTHPATTERN is present in $AUTHFILE ."
60+ check_param_pair_by_value $SECCONFFILE $DENYOPTION le $DENY_VAL
61+ if [ $FNRET = 0 ]; then
62+ ok " Option $DENYOPTION set condition is less than or equal to $DENY_VAL in $SECCONFFILE "
63+ elif [ $FNRET = 1 ]; then
64+ crit " Option $DENYOPTION set condition is greater than $DENY_VAL in $SECCONFFILE "
65+ elif [ $FNRET = 2 ]; then
66+ crit " Option $DENYOPTION is not conf in $SECCONFFILE "
67+ elif [ $FNRET = 3 ]; then
68+ crit " Config file $SECCONFFILE is not exist!"
69+ fi
70+ else
71+ crit " $AUTHPATTERN is not present in $AUTHFILE "
72+ FNRET=12
73+ fi
74+ fi
75+ }
76+
77+ audit () {
78+ if [ $ISDEBIAN11 = 1 ]; then
79+ audit_debian11
80+ else
81+ audit_before11
82+ fi
83+ }
84+
85+ apply_before11 () {
5486 if [ $FNRET = 0 ]; then
5587 ok " $DENYOPTION set condition is less-than-or-equal-to $DENY_VAL "
56- elif [ $FNRET = 1 ]; then
88+ elif [ $FNRET = 11 ]; then
5789 warn " Apply:$PACKAGE is absent, installing it"
5890 install_package $PACKAGE
5991 elif [ $FNRET = 2 ]; then
@@ -74,6 +106,56 @@ apply () {
74106 fi
75107}
76108
109+ # Input:
110+ # Param1: return-value of call check_param_pair_by_value
111+ # Function: Perform corresponding repair actions based on the return value of the error.
112+ apply_secconffile () {
113+ FNRET=$1
114+ if [ $FNRET = 0 ]; then
115+ ok " Option $DENYOPTION set condition is less than or equal to $DENY_VAL in $SECCONFFILE "
116+ elif [ $FNRET = 1 ]; then
117+ warn " Reset option $DENYOPTION to $DENY_VAL in $SECCONFFILE "
118+ replace_in_file $SECCONFFILE " ^$DENYOPTION .*" " $DENYOPTION = $DENY_VAL "
119+ elif [ $FNRET = 2 ]; then
120+ warn " $DENYOPTION is not conf, add to $SECCONFFILE "
121+ add_end_of_file $SECCONFFILE " $DENYOPTION = $DENY_VAL "
122+ elif [ $FNRET = 3 ]; then
123+ warn " Config file $SECCONFFILE is not exist! Please check it by youself"
124+ else
125+ warn " This param $FNRET was not defined!!!"
126+ fi
127+ }
128+
129+ apply_debian11 () {
130+ if [ $FNRET = 0 ]; then
131+ ok " $DENYOPTION set condition is less than or equal to $DENY_VAL in $SECCONFFILE "
132+ elif [ $FNRET = 11 ]; then
133+ warn " Apply:$PACKAGE is absent, installing it"
134+ install_package $PACKAGE
135+ does_pattern_exist_in_file $AUTHFILE $AUTHPATTERN
136+ if [ $FNRET != 0 ]; then
137+ add_line_file_after_pattern " $AUTHFILE " " $AUTHRULE " " $ADDPATTERNLINE "
138+ check_param_pair_by_value $SECCONFFILE $DENYOPTION le $DENY_VAL
139+ apply_secconffile $FNRET
140+ fi
141+ elif [ $FNRET = 12 ]; then
142+ add_line_file_after_pattern " $AUTHFILE " " $AUTHRULE " " $ADDPATTERNLINE "
143+ check_param_pair_by_value $SECCONFFILE $DENYOPTION le $DENY_VAL
144+ apply_secconffile $FNRET
145+ else
146+ apply_secconffile $FNRET
147+ fi
148+ }
149+
150+ # This function will be called if the script status is on enabled mode
151+ apply () {
152+ if [ $ISDEBIAN11 = 1 ]; then
153+ apply_debian11
154+ else
155+ apply_before11
156+ fi
157+ }
158+
77159# This function will check config parameters required
78160check_config () {
79161 if [ $OS_RELEASE -eq 2 ]; then
@@ -84,7 +166,19 @@ check_config() {
84166 AUTHRULE=' auth required pam_failloc.so deny=3 even_deny_root unlock_time=900'
85167 ADDPATTERNLINE=' auth[[:space:]]*required'
86168 else
87- :
169+ is_debian_11
170+ # faillock for Debian 11
171+ if [ $FNRET = 0 ]; then
172+ ISDEBIAN11=1
173+ SECCONFFILE=' /etc/security/faillock.conf'
174+ AUTHPATTERN=' ^auth[[:space:]]*required[[:space:]]*pam_faillock.so'
175+ AUTHRULE=' auth required pam_faillock.so'
176+ else
177+ ISDEBIAN11=0
178+ PAMLIBNAME=' pam_tally2.so'
179+ AUTHPATTERN=' ^auth[[:space:]]*required[[:space:]]*pam_tally2.so'
180+ AUTHRULE=' auth required pam_tally2.so deny=3 even_deny_root unlock_time=900'
181+ fi
88182 fi
89183}
90184
0 commit comments