linux系統安全加固
一、賬號相關
1、禁用或刪除無用賬號
減少系統無用賬號,降低安全風險。
當我們的系統安裝完畢后,系統默認自帶了一些虛擬賬戶,比如bin、adm、lp、games、postfix等,這些賬號理論上是可以刪除的。但是因為它們的登錄shell都是/sbin/nologin,所以它們本身也是無法登錄的,不用刪也可以。我們要注意的是系統安裝完成后,自己手動創建的一些賬戶,比如這些登錄shell是/bin/bash,一定要控制好。
1.1、使用cat /etc/passwd 命令查看所有賬號
如下圖所示:
注:/etc/passwd是存放用戶的地方,簡單學習一下。各個字段描述如下:
用戶名: 密碼 : uid : gid :用戶描述:主目錄:登陸shell
把系統一些自帶的賬號注釋掉:
注意:不建議直接刪除,當你需要某個用戶時,自己重新添加會很麻煩。
刪除用戶主要包括:adm,lp,sync,shutdown,halt,news,uucp,operator,games,ftp,postfix,dovecot
[root@localhost ~]# cp /etc/passwd /etc/passwdbak [root@localhost ~]# vim /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin #adm:x:3:4:adm:/var/adm:/sbin/nologin #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #sync:x:5:0:sync:/sbin:/bin/sync #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown #halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #operator:x:11:0:operator:/root:/sbin/nologin #games:x:12:100:games:/usr/games:/sbin/nologin #ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin #postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin lulu:x:1000:1000::/home/lulu:/bin/bash #dovecot:x:97:97:Dovecot IMAP server:/usr/libexec/dovecot:/sbin/nologin #dovenull:x:997:995:Dovecot's unauthorized user:/usr/libexec/dovecot:/sbin/nologin mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin dockerroot:x:996:993:Docker User:/var/lib/docker:/sbin/nologin dd:x:1001:1001::/home/dd:/bin/bash doubles:x:1002:1002::/home/doubles:/bin/bash apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin d1:x:1003:1004::/home/d1:/bin/bash d3:x:1004:1007::/home/d3:/bin/bash [root@localhost ~]# id adm id: adm: no such user [root@localhost ~]# id lp id: lp: no such user [root@localhost ~]#
注釋用戶組
刪除的用戶組包括:adm,lp,mail,games,ftp,audio
[root@localhost ~]# cp /etc/group /etc/groupbak [root@localhost ~]# vim /etc/group root:x:0: bin:x:1: daemon:x:2: sys:x:3: #adm:x:4: tty:x:5: disk:x:6: #lp:x:7: mem:x:8: kmem:x:9: wheel:x:10:doubles cdrom:x:11: mail:x:12:postfix man:x:15: dialout:x:18: floppy:x:19: #games:x:20: tape:x:30: video:x:39: #ftp:x:50: lock:x:54: #audio:x:63: .....
1.2、userdel -r刪除不必要的賬號
如果是一些自己添加的賬戶,不用的話,建議直接刪除。
加上參數-r,將賬號相應的home目錄與mail目錄都一起刪掉。
[root@localhost ~]# userdel -r d2 userdel: d2 mail spool (/var/spool/mail/d2) not found userdel: d2 home directory (/home/d2) not found [root@localhost ~]#
1.3、passwd -l禁用賬戶
使用passwd -l禁用賬戶dd,禁用后,root用戶仍然可以su,但是其他用戶無法su到dd,也無法通過xshell去ssh到dd了。
[root@localhost ~]# passwd -l dd Locking password for user dd. passwd: Success [root@localhost ~]# su dd [dd@localhost root]$ exit exit [root@localhost ~]# su - doubles Last login: Sat Sep 8 20:24:52 HKT 2018 on pts/2 [doubles@localhost ~]$ su dd Password: su: Authentication failure [doubles@localhost ~]$
1.4、passwd -u解鎖賬戶
使用passwd -u解鎖后,賬戶可以正常登陸。
[doubles@localhost ~]$ exit logout [root@localhost ~]# passwd -u dd Unlocking password for user dd. passwd: Success [root@localhost ~]# su doubles [doubles@localhost root]$ su dd Password: [dd@localhost root]$
2、檢查特殊賬號
檢查是否存在空口令和root權限的賬號。
2.1、檢測空口令賬戶
[root@localhost ~]# awk -F: '$2=="!!" {print $1}' /etc/shadow systemd-bus-proxy systemd-network dbus polkitd tss postfix sshd lulu dovecot dovenull mysql dockerroot apache d3
再去/etc/passwd查看哪些賬戶是可登錄的,如下:
2.2、加固空口令賬號
對無口令並且可登錄的賬戶,進行密碼設置:(注意密碼不能包含用戶名,也不能少於7位)
[root@localhost ~]# passwd lulu Changing password for user lulu. New password: Retype new password: passwd: all authentication tokens updated successfully. [root@localhost ~]# passwd d3 Changing password for user d3. New password: BAD PASSWORD: The password is shorter than 7 characters Retype new password: passwd: all authentication tokens updated successfully. [root@localhost ~]# [root@localhost ~]# passwd d3 Changing password for user d3. New password: Retype new password: passwd: all authentication tokens updated successfully.
2.3、檢測root權限賬號
使用命令 awk -F: '($3==0)' /etc/passwd 查看UID為零的賬號。
[root@localhost ~]# awk -F: '($3==0)' /etc/passwd root:x:0:0:root:/root:/bin/bash [root@localhost ~]#
確保uid為0的賬號只能是root賬號。
3、添加口令策略
3.1、密碼復雜度設置
加強口令的復雜度等,降低被猜解的可能性。
a、用戶密碼不能包含用戶名
b、用戶密碼不能少於10位
c、用戶密碼需要是特殊字符、數字、字母的組合
Linux對應的密碼策略模塊有:pam_passwdqc 和 pam_pwquality 。
pam_passwdqc模塊對應的是/etc/login.defs
pam_pwquality模塊對應的是/etc/security/pwquality.conf
(舊版是pam_cracklib.so)
3.1.1、修改/etc/login.defs
[root@localhost ~]# vim /etc/login.defs
PASS_MIN_LEN 10 #密碼最小長度,使用pam_cracklib module,該參數不再有效
3.1.2、修改/etc/pam.d/system-auth
修改前,我們先備份一下:
[root@localhost ~]# cp /etc/pam.d/system-auth /etc/pam.d/system-auth-backup
3.1.2.1、禁止使用舊密碼
找到同時有 “password” 和 “pam_unix.so” 字段並且附加有 “remember=5” 的那行,它表示禁止使用最近用過的5個密碼(己使用過的密碼會被保存在 /etc/security/opasswd 下面)。
配置如下:
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
3.1.2.2、設置密碼最小長度
找到同時有 “password” 和 “pam_cracklib.so” 字段並且附加有 “minlen=10” 的那行,它表示最小密碼長度為(10 - 類型數量)。這里的 “類型數量” 表示不同的字符類型數量。PAM 提供4種類型符號作為密碼(大寫字母、小寫字母、數字和標點符號)。如果你的密碼同時用上了這4種類型的符號,並且你的 minlen 設為10,那么最短的密碼長度允許是6個字符。
配置如下:
password requisite pam_cracklib.so retry=3 difok=3 minlen=10
3.1.2.3、其他復雜度設置
pam_cracklib.so比較重要和難於理解的是它的一些參數和計數方法,其常用參數包括:
debug:將調試信息寫入日志;
type=xxx:當添加/修改密碼時,系統給出的缺省提示符是“New UNIX password:”以及“Retype UNIX
password:”,而使用該參數可以自定義輸入密碼的提示符,比如指定type=your own word;
retry=N:定義登錄/修改密碼失敗時,可以重試的次數;
difok=N:定義新密碼中必須有幾個字符要與舊密碼不同。但是如果新密碼中有1/2以上的字符與舊密碼不同時,該新密碼將被接受;
minlen=N:定義用戶密碼的最小長度;
dcredit=N:定義用戶密碼中必須包含多少個數字;
ucredit=N:定義用戶密碼中必須包含多少個大寫字母;
lcredit=N:定義用戶密碼中必須包含多少個小些字母;
ocredit=N:定義用戶密碼中必須包含多少個特殊字符(除數字、字母之外);
我的配置如下:
主要是兩行:
[root@localhost ~]# vim /etc/pam.d/system-auth password requisite pam_pwquality.so try_first_pass local_users_only retry=3 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 difok=1 minlen=8 authtok_type="doubles type" password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
(注)
a、*credit=-1表示至少有一個的意思。
b、舊版的系統用的pam_cracklib.so,只要把上面的pam_pwquality.so替換成pam_cracklib.so就可以了。
c、Centos7以后都用pam_pwquality了,pam_pwquality完全向下兼容pam_cracklib,並且還提供了/etc/security/pwquality.conf進行參數配置。
3.1.2.4、測試
以上設置對root用戶完全不起作用的。root是個bug般的存在
[root@localhost ~]# passwd doubles Changing password for user doubles. New "doubles password: (輸入的是dd) BAD PASSWORD: The password is a palindrome Retype new "doubles password: (輸入的是dd123) Sorry, passwords do not match. New "doubles password: (輸入的是dd123) BAD PASSWORD: The password contains less than 1 uppercase letters Retype new "doubles password: (再次輸入dd123) passwd: all authentication tokens updated successfully. [root@localhost ~]#
以上root給doubles最終設置密碼為dd123,雖然不符合規則,但還是設置成功了,這就是root。
切換成普通用戶去更改自己的密碼:
[root@localhost ~]# su doubles [doubles@localhost root]$ passwd doubles passwd: Only root can specify a user name. [doubles@localhost root]$ passwd Changing password for user doubles. Changing password for doubles. (current) UNIX password: (輸入的是dd) passwd: Authentication token manipulation error [doubles@localhost root]$ passwd Changing password for user doubles. Changing password for doubles. (current) UNIX password: New "doubles password: (輸入的是dd123,跟老密碼一樣了,remember起作用了。) BAD PASSWORD: The password is the same as the old one New "doubles password: (輸入的是doubles,沒有數字) BAD PASSWORD: The password contains less than 1 digits New "doubles password: (輸入的是doubles123,沒有大寫) BAD PASSWORD: The password contains less than 1 uppercase letters passwd: Have exhausted maximum number of retries for service [doubles@localhost root]$ # 嘗試了最大次數,再試: [doubles@localhost root]$ passwd Changing password for user doubles. Changing password for doubles. (current) UNIX password: (當前密碼dd123) New "doubles password: (Doubles123,沒有特殊字符) BAD PASSWORD: The password contains less than 1 non-alphanumeric characters New "doubles password: (doubles123!!,包含用戶名) BAD PASSWORD: The password contains the user name in some form New "doubles password: (dd123456!!!,沒有大寫) BAD PASSWORD: The password contains less than 1 uppercase letters passwd: Have exhausted maximum number of retries for service [doubles@localhost root]$ passwd Changing password for user doubles. Changing password for doubles. (current) UNIX password: (當前密碼dd123) New "doubles password: (Dou12313456,沒有特殊字符) BAD PASSWORD: The password contains less than 1 non-alphanumeric characters New "doubles password: (dd123!!,少於8位了) BAD PASSWORD: The password is shorter than 8 characters New "doubles password: (Ddou123!!!) Retype new "doubles password: (Ddou123!!!) passwd: all authentication tokens updated successfully. [doubles@localhost root]$
3.2、設置用戶密碼過期時間
3.2.1、修改 /etc/login.defs
通過修改配置文件 vi /etc/login.defs ,設置全體用戶的密碼過期時間等。
[root@localhost ~]# vim /etc/login.defs PASS_MAX_DAYS 90 #新建用戶的密碼最長使用天數 PASS_MIN_DAYS 0 #新建用戶的密碼最短使用天數 PASS_WARN_AGE 7 #新建用戶的密碼到期提前提醒天數
3.2.2、使用命令chage
使用chage 命令單獨修改單用戶配置
chage -m (最短時間) -M (最長時間) -E (過期時間) -W (過期前X天提示) 用戶名
[root@localhost ~]# chage -m 0 -M 30 -E 2020-01-01 -W 7 doubles [root@localhost ~]#
表示將此用戶doubles的密碼最短使用天數設為0,最長使用天數設為30,密碼2020年1月1日過期,過期前七天警告用戶。
注意:當出現如下圖錯誤的時候,基本就是密碼過期了,可以使用上面的命令修改過期時間,即可重新登錄。
WARNING: Your password has expired.
You must change your password now and login again!
[root@localhost ~]# chage -m 0 -M 99999 -E 2020-01-01 -W 7 doubles
再重新連接即可不用修改密碼就能登錄了。
這里一般不建議把過期時間設為99999,之前30天,你設個60天就好了,延長30天。
3.3、密碼輸錯三次,鎖定用戶5分鍾
使用cat /etc/pam.d/sshd命令查看密碼策略:
設置連續輸錯三次密碼,賬號鎖定五分鍾,只能由root用戶解鎖。
3.3.1、修改配置:
一定要寫在#%PAM-1.0下面,否則即使輸錯三次,只要繼續輸對了密碼,還是可以登錄,導致無法鎖定。
auth required pam_tally2.so onerr=fail deny=3 unlock_time=300
參數解釋:
pam_tally2.so:位於/usr/lib64/security/下。(注意:如果用pam_tally.so,是沒有自動解鎖的功能。只能進單用戶模式解鎖。)
deny:設置普通用戶和root用戶連續錯誤登陸的最大次數,超過最大次數,則鎖定該用戶;
unlock_time 設定普通用戶鎖定后,多少時間后解鎖,單位是秒;
no_magic_root 連root用戶也在限制范圍,不給root特殊權限。
even_deny_root 也限制root用戶;
root_unlock_time 設定root用戶鎖定后,多少時間后解鎖,單位是秒;
3.3.2、上面配置完畢后,我們在另一台機器用ssh試一下:
這里故意輸錯三次密碼,
[doubles@localhost root]$ ssh dd1@192.168.188.129 dd1@192.168.188.129's password: Permission denied, please try again. dd1@192.168.188.129's password: Permission denied, please try again. dd1@192.168.188.129's password: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). [doubles@localhost root]$ [doubles@localhost root]$
輸錯三次后,再輸入正確密碼,發現也沒辦法登錄了。
[doubles@localhost root]$ ssh dd1@192.168.188.129 dd1@192.168.188.129's password: Permission denied, please try again. dd1@192.168.188.129's password: [doubles@localhost root]$
3.3.3、我們在192.168.188.129上面查看/var/log/secure日志發現:
[root@localhost ~]# vim /var/log/secure Sep 9 17:47:40 localhost unix_chkpwd[72389]: password check failed for user (dd1) Sep 9 17:47:40 localhost sshd[72387]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.188.128 user=dd1 Sep 9 17:47:42 localhost sshd[72387]: Failed password for dd1 from 192.168.188.128 port 46584 ssh2 Sep 9 17:47:43 localhost unix_chkpwd[72390]: password check failed for user (dd1) Sep 9 17:47:45 localhost sshd[72387]: Failed password for dd1 from 192.168.188.128 port 46584 ssh2 Sep 9 17:47:46 localhost sshd[72387]: pam_tally2(sshd:auth): user dd1 (1001) tally 3, deny 2 Sep 9 17:47:46 localhost unix_chkpwd[72391]: password check failed for user (dd1) Sep 9 17:47:48 localhost sshd[72387]: Failed password for dd1 from 192.168.188.128 port 46584 ssh2 Sep 9 17:47:48 localhost sshd[72387]: Connection closed by 192.168.188.128 [preauth] Sep 9 17:47:48 localhost sshd[72387]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.188.128 user=dd1 Sep 9 17:47:59 localhost sshd[72393]: pam_tally2(sshd:auth): user dd1 (1001) tally 4, deny 2 Sep 9 17:48:01 localhost sshd[72393]: Failed password for dd1 from 192.168.188.128 port 46586 ssh2 Sep 9 17:48:07 localhost sshd[72393]: Connection closed by 192.168.188.128 [preauth]
查看錯誤登錄次數:
[root@localhost ~]# pam_tally2 --user dd1 Login Failures Latest failure From dd1 4 09/09/18 17:47:59 192.168.188.128 [root@localhost ~]#
清空錯誤登錄次數:(解鎖)
[root@localhost ~]# pam_tally2 --user dd1 --reset Login Failures Latest failure From dd1 4 09/09/18 17:47:59 192.168.188.128 [root@localhost ~]# pam_tally2 --user dd1 Login Failures Latest failure From dd1 0 [root@localhost ~]#
3.3.4、其他設置
以上是針對遠程登錄的sshd,針對不同服務來限制不同登陸方式:
#只在本地文本終端tty上做限制,可以編輯如下文件,添加的內容和上方一樣。
vim /etc/pam.d/login
#只在遠程telnet、ssh登陸上做限制,可以編輯如下文件,添加的內容和上方也一樣。
vim /etc/pam.d/remote
vim /etc/pam.d/sshd
3.3.5、匯總更改
參考文檔:https://www.jb51.net/article/116935.htm
如果想要各個終端都限制,那么更改/etc/pam.d/password-auth。
加入下面兩行:
auth required pam_tally2.so deny=3 unlock_time=600 account required pam_tally2.so
注意:
很多教程里都說更改/etc/pam.d/system-auth文件,這是錯誤的,要看/etc/pam.d/sshd各終端調用的是哪個文件,像我這里就沒有調用這個文件,調用的是password-auth,如下圖:
這是/etc/pam.d/sshd:
再看/etc/pam.d/login:
通過上述兩個文件,你會發現sshd用了password-auth,而login用了system-auth,所以要看清楚再去設置相應的文件。
小編曾經就在這里折騰了好久,引以為鑒......
4、限制用戶su
禁止普通用戶su到root用戶,只允許指定的用戶su到root用戶。(需要root權限)
為禁止普通用戶su至root,需要分別修改/etc/pam.d/su和/etc/login.defs兩個配置文件。
4.1、只有wheel組用戶能夠su
4.1.1、配置
首先:將用戶加入到wheel組(后面會設置只有wheel組的用戶才能su到root)
[root@localhost ~]# usermod -G wheel doubles [root@localhost ~]# id doubles uid=1002(doubles) gid=1002(doubles) groups=1002(doubles),10(wheel)
去除/etc/pam.d/su文件中如下行的注釋:(表示要求用戶在wheel組下才能root)
[root@localhost ~]# vim /etc/pam.d/su auth required pam_wheel.so use_uid
在/etc/login.defs文件中加入如下配置項:(表示只有wheel組能夠su到root)
[root@localhost ~]# vim /etc/login.defs SU_WHEEL_ONLY yes
4.1.2、測試
下面我們切換到普通用戶su試一下
[root@localhost shellscript]# su dd [dd@localhost shellscript]$ id uid=1001(dd) gid=1001(dd) groups=1001(dd) [dd@localhost shellscript]$ su Password: su: Permission denied [dd@localhost shellscript]$
上面用戶dd沒有在wheel組下,所以即使輸入了正確的密碼也不能su,權限限制。而doubles是在wheel組下的,所以下面我們用doubles試一下
[root@localhost shellscript]# su doubles [doubles@localhost shellscript]$ su Password: [root@localhost shellscript]#
doubles在wheel組下,成功su到root。
4.2、自定義用戶組能夠su
除了wheel組,也可以配置只有指定的組的用戶能夠su到root。
參考:https://access.redhat.com/solutions/64860
https://www.cnblogs.com/kevingrace/p/8671964.html
A、創建用戶組groupa
[root@localhost ~]# groupadd groupa
B、創建/etc/security/su-groupa-access文件,里面指定允許su到的用戶
[root@localhost ~]# vim /etc/security/su-groupa-access doubles root
這就表示groupa的用戶可以su到root和doubles
保證文件權限不是所有人都可以修改的。
[root@localhost ~]# ll /etc/security/su-groupa-access -rw-r--r-- 1 root root 13 Sep 8 19:46 /etc/security/su-groupa-access
C、在/etc/pam.d/su下加入下面三行
[root@localhost ~]# vim /etc/pam.d/su auth [success=2 default=ignore] pam_succeed_if.so use_uid user notingroup groupa auth required pam_wheel.so use_uid group=groupa auth required pam_listfile.so item=user sense=allow onerr=fail file=/etc/security/su-groupa-access
配置如下圖:
D、將用戶dd加入到groupa組中測試
[root@localhost ~]# gpasswd -a dd groupa Adding user dd to group groupa [root@localhost ~]# id dd uid=1001(dd) gid=1001(dd) groups=1001(dd),1005(ddd),1006(groupa) [root@localhost ~]# su dd [dd@localhost root]$ su doubles Password: [doubles@localhost root]$ [doubles@localhost root]$ exit exit [dd@localhost root]$ su Password: [root@localhost ~]#
發現此時dd已經可以su到doubles和root了。
(注意)這里自定義用戶組的話,按照網上很多教程說的這樣加:
[root@localhost ~]# vim /etc/pam.d/su auth required pam_wheel.so group=test
是不起作用的,最后從redhat文檔里看到用創建 /etc/security/su-groupa-access的方式才真正成功。這里也是折騰了小編一下午呢,大家引以為鑒......
5、配置sudo權限
5.1、su與sudo簡介
5.1.1、su
su:就是switch user的意思,表示切換用戶。
普通用戶su到其他用戶需要輸入目標用戶的密碼。Root切換到其他用戶不需輸入密碼。
命令su后面什么都不接的時候表示切換到root用戶。
[doubles@localhost shellscript]$ su Password: [root@localhost shellscript]#
輸入su root(或者其他用戶名),表示不切換環境變量到當前用戶下。
[doubles@localhost root]$ su root Password: [root@localhost ~]#
輸入:su - root(或者其他用戶名)這里加了"-"后表示添加切換的當前的環境變量到新用戶的環境變量。
[doubles@localhost shellscript]$ su - root Password: Last login: Sat Sep 8 01:22:45 HKT 2018 on pts/2 [root@localhost ~]#
5.1.2、sudo
sudo命令:superuser do,表示以root的身份來執行后面的命令。
想要使用sudo,必須在/etc/sudoers里面給自己添加root權限。
Visudo命令:就是vi /etc/sudoers。
[doubles@localhost ~]$ visudo visudo: /etc/sudoers: Permission denied visudo: /etc/sudoers: Permission denied [doubles@localhost ~]$ sudo visudo [sudo] password for doubles: visudo: /etc/sudoers.tmp unchanged [doubles@localhost ~]$
5.2、指定用戶能夠sudo
配置普通用戶通過sudo繼承了root權限
在root用戶下,修改/etc/sudoers
[root@localhost ~]# ll /etc/sudoers -r--r-----. 1 root root 3941 Sep 6 18:32 /etc/sudoers
/etc/sudoers默認是只讀的,需要給/etc/sudoers添加可寫權限:
[root@localhost ~]# chmod u+w /etc/sudoers [root@localhost ~]# vim /etc/sudoers ## Allow root to run any commands anywhere root ALL=(ALL) ALL doubles ALL=(root) NOPASSWD: ALL
這幾項意思分別為:
第一列:doubles為要添加sudo權限的用戶
第二列:ALL表示從哪里登錄,ALL表示不限制本地遠程,可以填寫ip段
第三列:(root)表示以root身份執行
第四列:NOPASSWD:表示執行sudo的時候不需要密碼,默認不填就表示要輸入密碼。
第五列:ALL表示允許以root身份執行所有命令,以,隔開。
[root@localhost ~]# chmod g-w /etc/sudoers
現在doubles就可以通過sudo來以root身份執行命令了。
[doubles@localhost ~]$ sudo chmod u-w /etc/sudoers [doubles@localhost ~]$ ls [doubles@localhost ~]$ sudo vim /etc/sudoers [sudo] password for doubles: Sorry, try again. [sudo] password for doubles:
這個操作比較嚴格,所以可能會需要輸入密碼確認。
dd不在sudoers里,我們嘗試用dd進行sudo操作報錯。
[dd@localhost shellscript]$ sudo vim /etc/shadow dd is not in the sudoers file. This incident will be reported.
5.3、wheel組用戶能夠sudo
/etc/sudoers里面還有一項:
[doubles@localhost ~]$ ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL
這項表示允許wheel組的用戶執行所有用戶的所有命令,相當於wheel組的用戶都繼承了root權限。
比如,我們將dd加入到wheel組:
[root@localhost ~]# usermod -G wheel dd # (用命令gpasswd -a dd wheel也行)
/doubles/shellscript目錄只有root用戶可寫,理論上dd是不能在shellscript里創建文件的。
[root@localhost ~]# ll /doubles/shellscript/ -d drwxr-xr-x. 5 root root 4096 Sep 7 21:09 /doubles/shellscript/ [root@localhost ~]# cd /doubles/shellscript/ [root@localhost shellscript]# su dd [dd@localhost shellscript]$ mkdir aa mkdir: cannot create directory ‘aa’: Permission denied
普通用戶dd嘗試在root的目錄shellscript里創建目錄失敗,權限拒絕。
但是我們已經將dd加入到wheel組下了,所以用sudo試下
[dd@localhost shellscript]$ id dd uid=1001(dd) gid=1001(dd) groups=1001(dd),10(wheel) [dd@localhost shellscript]$ sudo mkdir aa [sudo] password for dd: [dd@localhost shellscript]$ ll aa -d drwxr-xr-x 2 root root 4096 Sep 7 21:09 aa
用sudo去創建目錄aa成功。所以wheel組下的dd也跟doubles用戶一樣可以通過sudo來以root身份執行所有的命令。
我們把dd從wheel組刪除:
[dd@localhost shellscript]$ sudo gpasswd -d dd wheel Removing user dd from group wheel [dd@localhost shellscript]$ id dd uid=1001(dd) gid=1001(dd) groups=1001(dd) 也可以去/etc/group里刪除: [dd@localhost shellscript]$ sudo vim /etc/group # wheel:x:10:doubles,dd wheel:x:10:doubles
5.4、自定義用戶組能夠sudo
編輯配置文件/etc/sudoers
[root@localhost ~]# vim /etc/sudoers ## Allows members of the users group to mount and unmount the ## cdrom as root # %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom ## Allows members of the users group to shutdown this system # %users localhost=/sbin/shutdown -h now # customize group's user to sudo %d1 ALL=(root) NOPASSWD: ALL
前面兩個注釋是教程實例,我們依樣自定義用戶組d1能夠通過sudo以root身份執行所有命令,而且不會詢問密碼。
測試如下:
[root@localhost ~]# su d1 [d1@localhost root]$ id d1 uid=1003(d1) gid=1004(d1) groups=1004(d1) [d1@localhost root]$ sudo vim /etc/shadow [d1@localhost root]$ sudo crontab -l #0 0 * * * /bin/bash /doubles/shellscript/cut_log.sh >>cutlog.log 2>&1 [d1@localhost root]$
如上所示,d1已經可以通過sudo去做只有root能做的事了,比如查看/etc/shadow
5.5、sudo密碼過期處理
5.5.1、背景:
按照上面的設置之后,我們就可以用sudo以root身份執行命令了。但是我們發現每次用sudo的時候都會提示我們輸入用戶密碼,所以我們一般會配置NOPASSWD:,如下:
doubles ALL=(root) NOPASSWD: ALL
但是我們發現,即使配置了NOPASSWD:,后面仍然還是有時候會提示我們輸入密碼,這是因為sudo的NOPASSWD:是有時間限制的,默認為5分鍾。
5.5.2、配置
如果想以后每次使用sudo的時候不再驗證密碼,可以在剛剛的sudoers文件做如下操作:
參數解釋:
其中timestamp_timeout=-1只需驗證一次密碼,以后系統自動記憶,runaspw需要root密碼,如果不加默認是要輸入普通賬戶的密碼.
timestamp_timeout=2:表示將密碼的超時時間設置為2分鍾。
timestamp_timeout=0:為0表示永遠提示輸入密碼。
timestamp_timeout=-1:
設置為負數的話(譯注,原文是”-1“,但是手冊中寫明只要是負數就可以)只需要證明一次你知道密碼就可以(譯注:就是密碼永不過期)。
如果你指向給某個特定用戶應用默認值的話,這樣做:
Defaults:doubles timestamp_timeout=-1
多個用戶已逗號隔開。
小技巧:如果軟件升級, /etc/sudoers 可能會被覆蓋掉,所以好的習慣是在 /etc/sudoers.d 中添加
在 /etc/sudoers.d 目錄中增加一個文件,添加相同的內容
6、ssh登錄配置
對SSH服務進行安全加固,防止暴力破解成功。
6.1、配置密鑰登錄
所有服務器管理人員,與需要登錄服務器的人員,都要配置密鑰登錄,避免使用密碼登錄。
關於在windows上,怎么配置與服務器登錄的密鑰,請查看文檔:
https://www.cnblogs.com/doublexi/p/9564493.html
(注):配置密鑰登錄的時候,一定要對自己的密鑰進行口令設置,否則別人拿到了你的私鑰,你的服務器就是別人的了。
6.2、禁止用密碼登錄
前面,我們已經配置了使用密鑰登錄,每個用戶只要記住自己密鑰的口令就可以了,他們登錄服務器已經不需要密碼了,所以我們為了安全,禁止用密碼登錄。
[root@localhost ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup [root@localhost ~]# vim /etc/ssh/sshd_config # To disable tunneled clear text passwords, change to no here! #PasswordAuthentication yes #PermitEmptyPasswords no PasswordAuthentication no
把PasswordAuthentication yes改為no。
改配置之前一定要記得,先備份一下,方便以后回滾。
改完配置之后,接下來就是重啟服務了,在重啟之前一定要確保:
確保已經按照6.1配置了密鑰登錄。
確保已經按照6.1配置了密鑰登錄。
確保已經按照6.1配置了密鑰登錄。
重要事情說三遍,確保自己配置了密鑰登錄,並且能夠通過這個密鑰登錄到服務器,特別是root。不然就是把自己鎖在了門外。。。
重啟ssh服務
[root@localhost ~]# systemctl restart sshd
重啟服務后,再次登錄的用戶就只能通過密鑰登錄了,通過密碼登錄會提示錯誤。
[root@localhost ~]# ssh -p 2202 root@192.168.188.128 Permission denied (publickey,gssapi-keyex,gssapi-with-mic). [root@localhost ~]# ssh -p 2202 doubles@192.168.188.128 Permission denied (publickey,gssapi-keyex,gssapi-with-mic). [root@localhost ~]#
通過xshell嘗試:
如圖所示,即使我們輸入了正確的用戶名和密碼,連接的時候會直接拒絕用密碼登錄。
拒絕密碼的,直接跳到密鑰登錄:
6.3、禁止root用戶直接登錄
為了加強服務器安全,我們應該
A、避免使用root賬戶直接登錄。
B、每個需要登錄服務器的操作人員都應該用自己的賬戶
C、管理員為這些賬戶分配不同的權限
D、部分人員(如管理員)需要執行特權操作時,通過su或者sudo去操作。
所以在上述4、5點的時候,我們必須要嚴格控制好各個用戶的su與sudo的權限。
接下來修改/etc/ssh/sshd_config來禁止root用戶直接登錄。
[root@localhost ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup [root@localhost ~]# vim /etc/ssh/sshd_config PermitRootLogin no
將PermitRootLogin的yes改為no。
改完配置,接下來自然是重啟服務了。重啟服務前,請確認:
A、確保自己已經配置了其他用戶可以登錄服務器
B、確保自己已經配置用戶可以su或者sudo(防止以后自己要改回來)
重啟服務:
[root@localhost ~]# systemctl restart sshd
重啟后,再用xshell登錄如圖所示:
在另一台服務器登錄也是一樣:
[root@localhost ~]# ssh -p 2202 root@192.168.188.128 Permission denied (publickey,gssapi-keyex,gssapi-with-mic). [root@localhost ~]#
6.4、SSH其他配置
我們登錄系統后,一般還會更改ssh的默認端口號,一般改為1024以上的。
[doubles@localhost ~]$ sudo vim /etc/ssh/sshd_config Port 2202
修改允許密碼錯誤次數(默認6次)。
設置 MaxAuthTries 的值為 3。
最終ssh配置修改總結為:
[doubles@localhost ~]$ sudo vim /etc/ssh/sshd_config Port 2202 PermitRootLogin no MaxAuthTries 3 RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys # To disable tunneled clear text passwords, change to no here! #PasswordAuthentication yes #PermitEmptyPasswords no PasswordAuthentication no
重啟服務:
[root@localhost ~]# systemctl restart sshd
6.5、登錄超時設置
讓用戶在登錄后,一段時間內不活動,自動登出。
6.5.1、修改環境變量TMOUT
$TMOUT = 30
參數說明:
# 用以下命令判斷是否是否設置了該參數
echo $TMOUT
# 如果輸出空或0表示不超時,大於0的數字n表示n秒沒有收入則超時
6.5.1.1、/etc/profile全局設置
查看/etc/profile之前是否有配置,有則修改,沒有則增加
[doubles@localhost ~]$ cat /etc/profile|grep TMOUT -n [doubles@localhost ~]$ [doubles@localhost ~]$ echo $TMOUT [doubles@localhost ~]$
上面$TMOUT變量為空,沒有設置
修改前先備份一下
[doubles@localhost ~]$ cp /etc/profile /etc/profile-backup
在/etc/profile最下面增加一行如下
[doubles@localhost ~]$ sudo vim /etc/profile # ---------------------------- export TMOUT=900 # ---------------------------- # 900就是15分鍾,將以上900修改為0就是設置不超時
接下來,source一下,讓配置立即生效
[doubles@localhost ~]$ source /etc/profile [doubles@localhost ~]$
測試:
配置完之后,不動終端,過了15分鍾之后自動退出如下:
[doubles@localhost ~]$ echo $TMOUT [doubles@localhost ~]$ sudo vim /etc/profile [doubles@localhost ~]$ source /etc/profile [doubles@localhost ~]$ timed out waiting for input: auto-logout Connection closing...Socket close. Connection closed by foreign host. Disconnected from remote host(192.168.188.128:2202) at 12:45:21. Type `help' to learn how to use Xshell prompt. [c:\~]$
6.5.1.2、個人超時配置
上面/etc/profile是對所有用戶都生效的,如果要只針對個別用戶配置登錄超時,可以通過修改個人home目錄下的.bashrc或.bash_profile文件來實現。
這兩個文件選擇其中一個在末尾加入如下一行,具體操作如下:
[doubles@localhost ~]$ pwd /home/doubles [doubles@localhost ~]$ vim .bash_profile export TMOUT=900 [doubles@localhost ~]$ source .bash_profile
測試結果如下:
[doubles@localhost ~]$ timed out waiting for input: auto-logout Connection closing...Socket close. Connection closed by foreign host. Disconnected from remote host(192.168.188.128:2202) at 14:59:19. Type `help' to learn how to use Xshell prompt. [c:\~]$
6.5.2、修改sshd_config
6.5.2.1、全局超時配置
通過修改ssh的配置文件 /etc/ssh/sshd_config我們同樣也可以實現超時自動登出功能,具體如下:
[doubles@localhost ~]$ sudo vim /etc/ssh/sshd_config
找到這兩行:
#ClientAliveInterval 0 #ClientAliveCountMax 3
修改如下:
ClientAliveInterval 300 ClientAliveCountMax 2
第一行表示每300秒檢測一次,默認為0表示不發送alive檢測
第二行表示檢測到2次(即2*300=600秒,即10分鍾)不活動就斷開連接。
上述配置,對除了root之外的用戶都生效。
保存退出,重啟服務:
[doubles@localhost ~]$ sudo systemctl restart sshd
關於這個配置,小編這里測試一直沒有生效,不知道為什么,用戶一直沒有被踢下線。。。。。。
從坑里爬出來的總結:
(啟發文:https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/296920)
引用原文的一句話:To make it work ClientAliveCountMax should to be 0
所以,以上配置全部忘掉,接下來我們重新弄:
[doubles@localhost ~]$ sudo vim /etc/ssh/sshd_config ClientAliveInterval 300 ClientAliveCountMax 0 # 這里必須是0
保存退出,重啟服務:
[doubles@localhost ~]$ sudo systemctl restart sshd
接下來,我們要退出登錄,讓整個shell連接都斷開,下次再重新進行ssh連接的時候,新的配置才會生效,否則你應用的還是上一次的配置。
一定要斷開連接
一定要斷開連接
一定要斷開連接
重要事情說三遍,
重點1:ClientAliveCountMax 0(必須是0)
重點2:必須退出整個ssh連接,重新登錄,配置才會生效。
6.5.2.2、個人不超時配置
在進行ssh連接的時候,加上參數:
法一:
[dd@localhost doubles]$ ssh -o ConnectTimeout=3 dd1@192.168.188.129 Enter passphrase for key '/home/dd/.ssh/id_rsa': Last login: Tue Sep 11 20:41:43 2018 from 192.168.188.128 [dd1@localhost ~]$ Connection to 192.168.188.129 closed by remote host. Connection to 192.168.188.129 closed. [dd@localhost doubles]$
法二:
[dd@localhost doubles]$ ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=0 dd1@192.168.188.129 Enter passphrase for key '/home/dd/.ssh/id_rsa': Last login: Tue Sep 11 22:22:15 2018 from 192.168.188.128 [dd1@localhost ~]$ Timeout, server 192.168.188.129 not responding. [dd@localhost doubles]$
這樣子只會在需要的連接中保持持久連接, 畢竟不是所有連接都要保持持久的
6.6、登錄日志配置
通過腳本代碼實現記錄所有用戶的登錄操作日志,防止出現安全事件后無據可查。
操作如下:(這里最好切換成root用戶來操作)
在profile最后一行追加:
[root@localhost ~]# vim /etc/profile history USER=`whoami` USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` if [ "$USER_IP" = "" ]; then USER_IP=`hostname` fi if [ ! -d /var/log/history ]; then mkdir /var/log/history chmod 777 /var/log/history fi if [ ! -d /var/log/history/${LOGNAME} ]; then mkdir /var/log/history/${LOGNAME} chmod 300 /var/log/history/${LOGNAME} fi export HISTSIZE=4096 DT=`date +"%Y%m%d_%H:%M:%S"` export HISTFILE=/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null [root@localhost ~]#
Source讓配置生效
[root@localhost ~]# source /etc/profile
注意: /var/log/history 是記錄日志的存放位置,可以自定義。
通過上述步驟,可以在 /var/log/history 目錄下以每個用戶為名新建一個文件夾,每次用戶退出后都會產生以用戶名、登錄IP、時間的日志文件,包含此用戶本次的所有操作(root用戶除外)。
同時,建議您使用OSS服務收集存儲日志。
6.7、屏蔽ssh的Banner信息
banner的作用:你用ssh登陸的時候,會自動顯示系統版本信息之類的敏感信息
有些版本會存在一些固有的安全問題,很容易被黑客利用。所以我們需要屏蔽這些信息。
這一點看需要,很多系統默認是沒有顯示Banner的。
6.7.1、檢查
查看/etc/ssh/sshd_config文件中是否存在Banner字段
[root@localhost ~]# cat /etc/ssh/sshd_config |grep -i banner # no default banner path #Banner none
發現Banner是none,沒有設置Banner,ssh連接是沒有信息顯示的,
查看/etc/motd 文件內容,該處內容將作為banner信息顯示給登錄用戶
[root@localhost ~]# cat /etc/motd [root@localhost ~]#
發現設置都是空的,那么ssh連接信息將如下:
通過xshell連接也是這樣:
沒有顯示什么有用的信息,所以可以不用屏蔽,下面直接略過。
6.7.2、屏蔽
如果有設置,那么屏蔽只需要Banner改為none即可。
操作前先備份
[root@localhost ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup [root@localhost ~]# cp -p /etc/motd /etc/motd_bak [root@localhost ~]# vim /etc/ssh/sshd_config Banner none [root@localhost ~]# vim /etc/motd
6.7.3、自定義Banner信息
參考:https://blog.csdn.net/sdb5858874/article/details/80525992
新建Banner文件ssh_banner
[root@localhost doubles]# vim /etc/ssh_banner Authorized only. All activity will be monitored and reported
將該文件歸為bin用戶和屬組
[root@localhost doubles]# chown bin:bin /etc/ssh_banner
設置權限為600
[root@localhost doubles]# chmod 644 /etc/ssh_banner
編輯登陸后的歡迎信息
[root@localhost doubles]# vim /etc/motd login success. All activity will be monitored and reported
修改ssh配置
[root@localhost doubles]# vim /etc/ssh/sshd_config Banner /etc/ssh_banner
重啟服務
[root@localhost doubles]# systemctl restart sshd
測試:
在另一台機發起ssh登錄請求:
終端登錄也是一樣:
Banner信息設置完畢。
7、為grub設置密碼
可以為linux引導器grub設置密碼,防止別人通過grub引導進入單用戶模式進行非法操作。(當然此項不是必須,因為當別人能接觸到你的grub的時候,也就說明你的機器已經被別人掌握了,此刻服務器已經沒有安全性可言了。)
方法一:命令設置(推薦)
查看系統默認密碼:
[root@localhost doubles]# cat /etc/grub2.cfg | grep password password_pbkdf2 root ${GRUB2_PASSWORD}
首先查看grub登錄用戶名:
[root@localhost doubles]# cat /etc/grub.d/01_users #!/bin/sh -e cat << EOF if [ -f \${prefix}/user.cfg ]; then source \${prefix}/user.cfg if [ -n "\${GRUB2_PASSWORD}" ]; then set superusers="root" export superusers password_pbkdf2 root \${GRUB2_PASSWORD} fi fi EOF [root@localhost doubles]#
通過上面發現用戶名是root,接下來通過grub2-setpassword命令修改密碼:
[root@localhost doubles]# grub2-setpassword Enter password: Confirm password: [root@localhost doubles]#
改完密碼重啟:
[root@localhost doubles]# init 6
在選擇內核的時候,按e,如下圖:
此時它會提示你輸入用戶名和密碼:
輸入完用戶名和密碼之后,就進入了
在這里你就可以修改root密碼的,慎重。。。
注意:以上環境是centos7,7以下的系統環境略有所不同。這里不建議按照網上說的,通過修改/etc/grub2.cfg或者/etc/grub.d/00_header文件來明文指定密碼。
方法二:明文密碼
操作前,先備份一下文件
[root@localhost ~]# cp /etc/grub2.cfg /etc/grub2.cfg_backup
先查看之前是否有設置密碼:
[root@localhost ~]# cat /etc/grub2.cfg | grep password
在/etc/grub.d/01_users文件中指定超級用戶,其中root為超級用戶的用戶名,PassRoot+123為超級用戶root的密碼,清空該文件並添加以下幾行。(用戶名和密碼按實際情況設置)
[root@localhost ~]# cp /etc/grub.d/01_users /etc/grub.d/01_users_backup [root@localhost ~]# vim /etc/grub.d/01_users cat << EOF set superusers="root" password root DoublesRoot!!123 EOF
我把之前的注釋了,重新添加的,如下:
重新編譯配置文件:
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-ea399cee8fa94b1d9901ffd9d37bf7c6 Found initrd image: /boot/initramfs-0-rescue-ea399cee8fa94b1d9901ffd9d37bf7c6.img done [root@localhost ~]#
此時重新查看配置文件,發現多了密碼,而且這個密碼是明文的,不安全。
[root@localhost ~]# cat /etc/grub2.cfg |grep password password root DoublesRoot!!123 [root@localhost ~]#
此時,grub密碼設置成功,重啟即可生效。
方法三:密文密碼
方法二是明文密碼,在/etc/grub2.cfg就可以看到,很不安全,接下來我們設置密文密碼。
使用grub2-mkpasswd-pbkdf2命令創建密文
[root@localhost ~]# grub2-mkpasswd-pbkdf2 Enter password: Reenter password: PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.94A2F8EEA383CA6DDC6B432E9878FD12A02BF114A9B13FEAE0D2E834ADFF4B0A791DD1FDFF7A21E9CA3E277D567CDC12E2E99AEE7EF83E0D52B534B740B2117A.729B52B7BA281FF693EA3EA02FC7C22275A17DEEDF994BFAEC4B8ECC5046FC86FCDAB7B68D33DAC3A7419AA8C32B6F9AFE901BEBB4F4DFABC6213BE03FC1D711 [root@localhost ~]#
上面會輸出一段密文,我們把它復制到/etc/grub.d/01_user里面,如下:
[root@localhost ~]# vim /etc/grub.d/01_users cat << EOF set superusers="root" password_pbkdf2 root PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.94A2F8EEA383CA6DDC6B432E9878FD12A02BF114A9B13FEAE0D2E834ADFF4B0A791DD1FDFF7A21E9CA3E277D567CDC12E2E99AEE7EF83E0D52B534B740B2117A.729B52B7BA281FF693EA3EA02FC7C22275A17DEEDF994BFAEC4B8ECC5046FC86FCDAB7B68D33DAC3A7419AA8C32B6F9AFE901BEBB4F4DFABC6213BE03FC1D711 EOF
最后:重新編譯生成grub2.cfg文件
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-ea399cee8fa94b1d9901ffd9d37bf7c6 Found initrd image: /boot/initramfs-0-rescue-ea399cee8fa94b1d9901ffd9d37bf7c6.img done [root@localhost ~]#
檢查/etc/grub2.cfg,發現多了一段密文
[root@localhost ~]# cat /etc/grub2.cfg | grep password password_pbkdf2 root PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.94A2F8EEA383CA6DDC6B432E9878FD12A02BF114A9B13FEAE0D2E834ADFF4B0A791DD1FDFF7A21E9CA3E277D567CDC12E2E99AEE7EF83E0D52B534B740B2117A.729B52B7BA281FF693EA3EA02FC7C22275A17DEEDF994BFAEC4B8ECC5046FC86FCDAB7B68D33DAC3A7419AA8C32B6F9AFE901BEBB4F4DFABC6213BE03FC1D711 [root@localhost ~]#
密鑰設置成功,重啟即生效。