戳下方名片,關注並星標

回覆“1024”獲取2TB學習資源!

👉體系化學習:運維工程師打怪升級進階之路 4.0

   特色專欄  

MySQL PostgreSQL MongoDB

ElasticSearch / Hadoop / Redis

Kubernetes Docker / DevOps

Kafka RabbitMQ Zookeeper 

監控平臺 應用與服務 集群管理

Nginx Git Tools / OpenStack

大家好,我是民工哥!

今天來聊一聊關於Linux 系統的安全加固。

Linux是一套免費使用和自由傳播的類Unix操作系統,作為一個開放源代碼的操作系統,Linux服務器以其安全、高效和穩定的顯著優勢而得以廣泛應用,但如果不做好權限的合理分配,Linux系統的安全性還是會得不到更好的保障,下面我們將主要使用RHEL7系統,分別從賬戶安全、登錄控制,SeLinux配置等,優化Linux系統的安全性。

早在1985年,美國國防部就已經提出了可信計算機系統評測標準TCSEC,TCSEC將系統分成ABCD四類7個安全級別。D級是安全級別最低的級別,C類為自主保護級別;B類為強制保護級別;A類為驗證保護類。

  • • D級,最低安全性

  • • C1級,主存取控制

  • • C2級,較完善的自主存取控制(DAC)、審計

  • • B1級,強制存取控制(MAC)

  • • B2級,良好的結構化設計、形式化安全模型

  • • B3級,全面的訪問控制、可信恢復

  • • A1級,形式化認證

當前主流的操作系統安全性遠遠不夠,如Windows NT都只能達到C2級,安全性均有待提高,不過經過安全加固後的Linux系統可達到B1的安全級別。

控制系統賬戶:系統賬戶默認存放在cat /etc/passwd中,你可以手動查詢用戶信息,我們直接除了Root賬戶需要登錄以外,其他的賬戶全部設置為禁止登錄。

使用 passwd -l 用戶名 鎖定用戶登錄,如下我們寫BASH腳本批量的完成這個過程。

#!/bin/bash

for temp in `cut -d ":" -f 1 /etc/passwd | grep -v "root"`
do
        passwd -l $temp
done

修改口令生存期:口令生存期,即用戶密碼的過期時間,默認在cat /etc/login.defs | grep "PASS" 中存儲著,我們需要把這個時間改小,如下配置即可。

[root@localhost ~]# vim /etc/login.defs

# Password aging controls:
#
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   90      # 新建用戶密碼最長使用天數
PASS_MIN_DAYS   0       # 新建用戶密碼最短使用天數
PASS_MIN_LEN    7       # 新建用戶密碼到期提示天數
PASS_WARN_AGE   10      # 最小密碼長度

設置口令複雜度:設置新建用戶時輸入的口令複雜程度,該配置默認在cat /etc/pam.d/system-auth 文件中存放。

[root@localhost ~]# 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.

password    required pam_cracklib.so try_first_pass retry=3 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1 minlen=10

在上方文件中添加如下一行配置,其含義是至少包含一個數字、一個小寫字母、一個大寫字母、一個特殊字符、且密碼長度>=10。

限制登錄超時:限制用戶登陸成功後的等待時間,當用戶終端無操作時則默認斷開連接。

[root@localhost ~]# vim /etc/profile

TMOUT=300
export TMOUT

限制TTY嘗試次數:該配置可以有效的防止,爆破登錄情況的發生,其配置文件在cat /etc/pam.d/login中添加如下配置,這個方法只是限制用戶從TTY終端登錄,而沒有限制遠程登錄。

[root@localhost ~]# vim /etc/pam.d/login

#%PAM-1.0
auth required  pam_tally2.so deny=3 lock_time=300 even_deny_root root_unlock_time=10

[root@localhost ~]# pam_tally2 --user lyshark    查詢遠程登錄次數

修改SSH遠程端口:修改SSH登錄端口,這裡可以修改為65534等高位端口,因為Nmap掃描器默認也就探測0-1024端口,這樣能夠有效的規避掃描。

[root@localhost ~]# vim /etc/ssh/sshd_config

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 65534               # 登錄端口改為65534
MaxAuthTries=3           # 密碼最大嘗試次數3

[root@localhost ~]# systemctl restart sshd
[C:\Users]$ ssh [email protected] 6553

禁止Root用戶登錄:首先創建一個普通用戶 lyshark ,然後配置好Sudo授權,需要時使用Sudo授權執行命令,禁止Root用戶登錄主機。

# --------------------------------------------------------------------------------------------
# 創建普通用戶 lyshark
[root@localhost ~]# useradd lyshark
[root@localhost ~]# passwd lyshark

# --------------------------------------------------------------------------------------------
# 給普通用戶添加Sudo授權
[root@localhost ~]# vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       ALL
# --------------------------------------------------------------------------------------------
# 修改ROOT用戶禁止登錄系統
[root@localhost ~]# vim /etc/ssh/sshd_config
PermitRootLogin no

[root@localhost ~]# systemctl restart sshd

除此之外,你可以通過指定那些被允許用來使用SSH的用戶名,從而使得SSH服務更為安全。

[root@localhost ~]# vim /etc/ssh/sshd_config

AllowUsers lyshark admin          # 指定允許登錄的用戶
AllowGroup lyshark admin         # 指定允許登錄的用戶組

登錄警告提示:通過修改 /etc/motd/etc/issue.net來實現彈出警告提示框,當用戶遠程登陸以後就會提示以下的兩行文字。

[root@localhost ~]# vim /etc/motd
[root@localhost ~]# vim /etc/issue.net

-----------------------------------------------------------------------------------------------
Warning! If unauthorized, illegal login system, please exit immediately!!
Your system fingerprint has been recorded!!
-----------------------------------------------------------------------------------------------

限制Umask值:umask 值用於設置文件的默認屬性,系統默認的Umask 值是0022,也就是U權限不動,G權限減去2,O權限減2,這裡為了防止上傳一句話木馬,我們將系統的Umask值改為0777,也就是說,當用戶新建任何文件的時候,其都不會具有(讀寫執行)權限,就算上傳成功也不具有任何權限。

[root@localhost ~]# echo "umask 0777" >> /etc/bashrc
[root@localhost ~]# touch test1
[root@localhost ~]# mkdir test2
[root@localhost ~]
[root@localhost ~]# ls -lh
total 0
----------. 1 root root 0 Aug 25 05:46 test1
d---------. 2 root root 6 Aug 25 05:46 test2

鎖定系統文件:鎖定文件是Linux系統中最為強大的安全特性,任何用戶(即使是root),都無法對不可修改文件進行寫入、刪除、等操作,我們將一些二進制文件設置為只讀模式,能夠更好的防止系統被非法篡改或注入惡意代碼,一般情況下/sbin 和/usr/lib兩個目錄內容能被設置為不可改變。

[root@localhost sbin]# chattr +i /sbin/
[root@localhost sbin]# chattr +i /usr/sbin/
[root@localhost sbin]# chattr +i /bin/
[root@localhost sbin]# chattr +i /sbin/
[root@localhost sbin]# chattr +i /usr/lib
[root@localhost sbin]# chattr +i /usr/lib64
[root@localhost sbin]# chattr +i /usr/libexec

限制GCC編譯器:如果系統已經被黑客入侵,那麼黑客的下一個目標應該是編譯一些POC文件,用來提權,從而在幾秒鐘之內就成為了root用戶,那麼我們需要對系統中的編譯器進行一定的限制。

首先,你需要檢查單數據包以確定其包含有哪些二進制文件。然後將這些文件全部設置為000無權限。

[root@localhost ~]# rpm -q --filesbypkg gcc | grep "bin"

[root@localhost ~]# chmod 000 /usr/bin/c89 
[root@localhost ~]# chmod 000 /usr/bin/c99 
[root@localhost ~]# chmod 000 /usr/bin/cc
[root@localhost ~]# chmod 000 /usr/bin/gcc
[root@localhost ~]# chmod 000 /usr/bin/gcc-*
[root@localhost ~]# chmod 000 /usr/bin/gcc-*

然後,單獨創建一個可以訪問二進制文件的編譯器的組,賦予他這個組相應的權限。

[root@localhost ~]# groupadd compilerGroup
[root@localhost ~]# chown root:compilerGroup /usr/bin/gcc
[root@localhost ~]# chmod 0750 /usr/bin/gcc

至此,任何試圖使用gcc的用戶將會看到權限被拒絕的信息。

[lyshark@localhost ~]$ gcc -c test.c 
-bash: /usr/bin/gcc: Permission denied

限制日誌文件:接著我們需要對日誌文件,進行一定的限制,因為一般情況如果系統被入侵了,日誌文件將對我們取證有所幫助,而一旦被入侵以後,黑客首先會想辦法清除這些痕跡,所以我們需要設置日誌文件只能增加不能刪除屬性,防止其將日誌刪除掉。

[root@localhost ~]# cd /var/log/
[root@localhost log]# chattr +a dmesg cron lastlog messages secure wtmp 

[root@localhost log]# lsattr secure 
-----a---------- secure

[root@localhost log]# rm -fr secure 
rm: cannot remove ‘secure’: Operation not permitted

最小化防火牆規則:配置防火牆,拒絕所有端口,只放行SSH,HTTP這兩個必要的端口。

[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -p INPUT DROP

[root@localhost ~]# iptables -I INPUT -p tcp --dport 6553 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -p tcp --dport 6553 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --doprt 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
[root@localhost ~]# iptables-save

開啟SELinux:由於系統管理員都會關閉,所以這裡要手動開啟。

[root@localhost ~]# vim /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing

[root@localhost ~]# setenforce 1

開啟SeLinux後,會發現sshd服務無法正常啟動了,這是因為SELinux策略生效了,下面我們需要修改配置。

SELinux放行SSH端口:通過 Semanage 管理工具放行6553這個端口。

[root@localhost ~]# yum install -y policycoreutils-python-2.5-29.el7.x86_64

[root@localhost ~]# semanage port -l | grep ssh
ssh_port_t                     tcp      22

[root@localhost ~]# semanage port -a -t ssh_port_t -p tcp 6553

[root@localhost ~]# semanage port -l | grep ssh
ssh_port_t                     tcp      6553, 22

設置Web目錄權限:通過 semanage 命令設置,web目錄權限。

[root@localhost html]# semanage fcontext -a -t httpd_sys_content_t /var/www/html/index.html

[root@localhost html]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
出處:https://cnblogs.com/LyShark/p/11407373.html

👍 如果你喜歡這篇文章,請點贊並分享給你的朋友!

公眾號讀者專屬技術群

構建高質量的技術交流社群,歡迎從事後端開發、運維技術進群(備註崗位,已在技術交流群的請勿重複添加微信好友)。主要以技術交流、內推、行業探討為主,請文明發言。廣告人士勿入,切勿輕信私聊,防止被騙。

掃碼加我好友,拉你進群

剛剛博客園發出求救信!又快活不下去了

臥槽!阿里雲的 Docker 鏡像加速也不能用了

牛逼了!中國 AI 大模型全球排名第一

沒想到 GitHub 竟是最專業的「吃瓜平臺」

突發!博通嚴查 VMware 盜版!

全員加薪!

華為的加班工資曝光!

Linux 新系統全新發布!

騰訊課堂關閉的原因曝光!

PS:因為公眾號平臺更改了推送規則,如果不想錯過內容,記得讀完點一下在看,加個星標,這樣每次新文章推送才會第一時間出現在你的訂閱列表裡。在看支持我們吧!