系統安全
系統權限
一、安裝系統
1. 選擇穩定版作業系統
2. 最小化安裝
3. 不要安裝gcc,make
4. 安裝完系統後更新系統
二、檔案(目錄)權限
1. 基本權限 rwx
- 對于目錄,預設權限=777-umask
- 對于檔案,預設權限=666-umask(檔案預設無執行權限)
- 修改umask
[[email protected] ~]# vim /etc/bashrc
71 umask 002 #普通使用者
72 else
73 umask 022 #超級使用者
74 fi
[[email protected] ~]# vim /etc/profile
60 umask 002 #普通使用者
61 else
62 umask 022 #超級使用者
2. 特殊權限 suid sgid sticky
- suid 冒險位,執行二進制檔案與檔案所有人有關,與誰來執行無關
- sgid 強制位,對目錄生效,在此目錄中建立檔案自動歸入目錄所在組
- sticky 粘制位,目錄中的檔案隻能被檔案擁有者删除
3. 檔案ACL getfacl setfacl
- 對檔案的權限進行附加說明的權限設定方式
- ACL提供傳統的owner/group/other的read/write/execute之外的細部權限設定。(可以針對單一的使用者,目錄等等)
- 檢視
[[email protected] ~]# ls -l
總用量 1
-rw-r--r-- 1 root root 4 2 月 17 20 :56 test.txt
#-rw-r--r--+ 如果權限後面帶有‘+’号表示有ACL權限
[[email protected] ~]# getfacl test.txt
# file: test.txt 檔案名
# owner: root 檔案所屬者
# group: root 檔案所屬組
user::rw- 屬主權限
group::r-- 屬組權限
other::r-- 其他人權限
- 設定ACL權限
[[email protected] ~]# useradd jack
[[email protected] ~]# setfacl -m u:jack:rw test.txt
#setfacl -m <u|g|m>:<username|groupname>:權限 filename
#setfacl -x <u|g>:<username|groupname> filename ##去除某個使用者或者組的acl
#setfacl -b filename ##删除檔案上的權限清單
[[email protected] ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:jack:rw- 為jack設定rw權限
group::r--
mask::rw-
other::r--
[[email protected] ~]# ls -l test.txt
-rw-rw-r--+ 1 root root 4 2 月 17 20 :56 test.txt
4. 檔案屬性 chattr lsattr +a -a +i -i -d
[[email protected] ~]# chattr +a test.txt
#隻能給檔案添加内容,但是删除不了,屬于追加
[[email protected] ~]# chattr -a test.txt
[[email protected] ~]# chattr +i test.txt
#檔案不能删除,不能更改,不能移動
[[email protected] ~]# lsattr test.txt
----i----------- test.txt
案例 1 :防删除,防修改
案例 2 :日志檔案防删除
[[email protected] ~]# chattr +a /var/log/messages /var/log/secure
#日志切割要先去掉a屬性,之後增加a屬性
[[email protected] ~]# vim /etc/logrotate.d/syslog
prerotate
chattr -a /var/log/messages
endscript
...
postrotate
chattr +a /var/log/messages
endscript
}
5. mask umask權限
[[email protected] ~]# umask
0022
[[email protected] ~]# umask -S
u=rwx,g=rx,o=rx
6. mount 權限 -o
rw ro
sync async
此選項的預設模式為異步模式。在同步模式下,記憶體的任何修改都會實時的同步到硬碟當中,這種模式的安全性基本屬于最高,但是因為記憶體的資料基本一直都在變化,是以這種模式會使得程式運作變得緩慢,影響效率。而在異步模式下,雖然同步沒有實時,但是現在考慮到日志檔案系統的存在,是以安全性基本不用考慮,而異步模式的效率會更高,随意目前普遍使用異步模式為預設
auto noauto
合理規劃權限,盡量避免 777 權限出現
使用者授權
su
- 由超級使用者切換為普通使用者,僅切換使用者,環境變量不切換,如若為普通使用者,會導緻指令不可用
[[email protected] ~]# su jack
[[email protected] root]$
- 由超級使用者切換為普通使用者,切換使用者至家目錄,環境變量會發生改變
[[email protected] ~]# su - jack
上一次登入:日 2 月 17 21 :48:05 CST 2019pts/1 上
[[email protected] ~]$
- 由普通使用者切換為root使用者
[[email protected] ~]$ su - root
密碼: #需要輸入密碼,可擷取root全部權限,此處密碼認證由PAM提供
上一次登入:日 2 月 17 20 :45:56 CST 2019 從 192 .168.2.1pts/1 上
[[email protected] ~]#
sudo
給普通使用者提升(賦予)權限的方法
- suid,sgid
- usermod
- switching users with su
- running commands as root with sudo
使用sudo提升(賦予)權限普通使用者的權限
可根據/etc/sudoers檔案設定普通使用者使用sudo指令時可以以root身份或其他使用者身份運作指令
- 使用vim直接編輯/etc/sudoers檔案
[[email protected] ~]# vim /etc/sudoers
#不推薦
- 使用visudo編輯/etc/sudoers
[[email protected] ~]# visudo
#推薦,會檢查文法
- sudo文法
#user MACHINE=(RUN_AS_USER) COMMANDS
jack ALL=ALL ALL
#允許jack使用者 在任何主機上=(以任何人的身份) 執行任何指令
- 案例
案例 1 :對使用者
[[email protected] ~]# grep jack /etc/passwd
jack:x:1001:1001::/home/jack:/bin/bash
[[email protected] ~]# grep owen /etc/passwd
owen:x:1002:1002::/home/owen:/bin/bash
[[email protected] ~]# visudo
jack ALL=/sbin/ip, /sbin/fdisk, /bin/less
#賦予jack使用者使用以上 3 個指令的權限
[[email protected] ~]# visudo
owen ALL=NOPASSWD: /bin/less
##賦予owen使用者使用以上 1 個指令的權限,切換時不需要輸入密碼
案例 2 :對組
[[email protected] ~]# groupadd smartgo
[[email protected] ~]# useradd it01 -G smartgo
[[email protected] ~]# useradd it02 -G smartgo
[[email protected] ~]# id it01
uid= 1003 (it01) gid= 1004 (it01) 組= 1004 (it01),1003(smartgo)
[[email protected] ~]# id it02
uid= 1004 (it02) gid= 1005 (it02) 組= 1005 (it02),1003(smartgo)
[[email protected] ~]# visudo
%smartgo ALL=NOPASSWD: /sbin/ip
%smartgo ALL=NOPASSWD: /sbin/useradd, /sbin/userdel, /bin/passwd
%smartgo ALL=NOPASSWD: !/bin/passwd root, !/bin/passwd root --stdin,!/bin/passwd --stdin root
[[email protected] ~]# su - it01
[[email protected] ~]$ sudo passwd root
對不起,使用者 it01 無權以 root 的身份在 localhost.localdomain 上執行 /bin/passwd root。
案例 3 :别名使用
[[email protected] ~]# visudo
## Host Aliases
# Host_Alias FILESERVERS = fs1, fs
Host_Alias MAILSERVERS = smtp, smtp
## User Aliases
User_Alias ADMINS = jsmith, mikem
## Command Aliases
## These are groups of related commands...
## Networking
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,
/usr/bin/net,
/sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
## Installation and management of software
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Services
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
## Updating the locate database
Cmnd_Alias LOCATE = /usr/bin/updatedb
## Storage
Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe,
/bin/mount, /bin/umount
jack ALL=NOPASSWD: NETWORKING
%smartgo ALL=NOPASSWD: STORAGE
ADMINS ALL=NOPASSWD: NETWORKING, STORAGE
- sudo日志
[[email protected] ~]# grep '^authpriv' /etc/rsyslog.conf
authpriv.* /var/log/secure
[[email protected] ~]# tail -f /var/log/secure
Feb 17 22 :31:52 localhost passwd: pam_unix(passwd:chauthtok): password changed for
root
Feb 17 22 :31:52 localhost passwd: gkr-pam: couldn't update the login keyring password:
no old password was entered
Feb 17 22 :32:15 localhost sudo: it01 : command not allowed ; TTY=pts/1 ;
PWD=/home/it01 ; USER=root ; COMMAND=/bin/passwd root --stdin
Feb 17 22 :32:28 localhost su: pam_unix(su-l:session): session closed for user it
Feb 17 22 :33:10 localhost su: pam_unix(su-l:session): session opened for user it01 by
root(uid= 0 )
Feb 17 22 :33:17 localhost sudo: it01 : command not allowed ; TTY=pts/1 ;
PWD=/home/it01 ; USER=root ; COMMAND=/bin/passwd root
Feb 17 22 :33:30 localhost sudo: it01 : TTY=pts/1 ; PWD=/home/it01 ; USER=root ;
COMMAND=/bin/passwd owen
Feb 17 22 :33:36 localhost passwd: pam_unix(passwd:chauthtok): password changed for
owen
Feb 17 22 :33:36 localhost passwd: gkr-pam: couldn't update the login keyring password:
no old password was entered
Feb 17 22 :33:39 localhost su: pam_unix(su-l:session): session closed for user it01
使用者認證
使用者認證方式
- PAM(gdm,kdm,su,ssh,ftp,samba)
- 自帶資料庫驗證方式(MySQL,Zabbix)
- web驗證方式(htpasswd)
- 集中式身份認證
PAM介紹
PAM(Pluggable Authentication Modules) 即可插拔式認證子產品,它是一種高效而且靈活的使用者級别的認證方式,它也是目前Linux伺服器普遍使用的認證方式。
PAM可以根據使用者的網段、時間、使用者名、密碼等實作認證。
PAM身份認證
使用PAM做身份認證的服務有:本地(login、gdm、kdm), sshd, vsftpd,samba等
不使用PAM做身份認證的服務有:MySQL-Server,Zabbix等
- PAM使用幫助
-PAM認證原理
Service(程序檔案) → PAM(配置檔案) → pam_*.so → 子產品的配置檔案
/usr/sbin/sshd /etc/pam.d/sshd /lib64/security/pam_access.so
/etc/security/access.conf
/lib64/security/pam_limits.so
/etc/security/limits.conf
/lib64/security/pam_time.so
/etc/security/time.conf
/bin/su /etc/pam.d/su /lib64/security/pam_rootok.so
- PAM認證原理案例
[[email protected] ~]# ldd /usr/sbin/sshd | grep -i pam
libpam.so.0 => /lib64/libpam.so.0 (0x00007f65d9d8e000)
[[email protected] ~]# grep -i pam /etc/ssh/sshd_config
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
UsePAM yes
[[email protected] ~]# vim /etc/pam.d/sshd
#%PAM-1.
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
#與polkit一起使用以重新授權遠端會話中的使用者
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
#selinux關閉執行如下
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user
context
#selinux開啟執行如下
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
- PAM常見的四種認證類型
auth 認證管理 驗證使用者身份,賬号和密碼
account 使用者管理 基于使用者時間或密碼有效期來決定是否允許通路
password 密碼(密碼) 認證管理 禁止使用者反複嘗試登入,在變更密碼時進行密碼複雜性控制
session 會話管理 進行日志記錄,或者限制使用者登入的次數,資源限制
- PAM認證流程控制(流程标記)
Required (必要條件) 驗證失敗時仍然繼續,但傳回fail 使用者不會知道哪裡失敗
Requisite (必要條件) 驗證失敗時則立即結束整個驗證過程,傳回fail 面試若不成功,馬上失敗,效率高
Sufficient (充分條件) 驗證成功則立即傳回,不再繼續,否則忽略結果并繼續 相當于面試中的拔高題
Optional (可選條件) 無論驗證結果如何,均不會影響 常用于session類型
Include 包含另外一個配置檔案中類型相同的行
substack 垂直疊加
- PAM常用子產品
子產品:pam_rootok.so
功能:使用者UID是 0 ,傳回成功
示例:限制root切換使用者也需要密碼
[[email protected] ~]# head -1 /etc/pam.d/su
#auth sufficient pam_rootok.so
示例:sshd不需要密碼登入
[[email protected] ~]# head -1 /etc/pam.d/sshd
auth sufficient pam_rootok.so
#放在檔案的第一行
子產品:pam_access.so
功能:通路控制,預設配置檔案/etc/security/access.conf
通常作用于登入程式,如su,login,gdm,sshd,
例如:限制使用者從哪些網段登入sshd
示例:不允許root從192.168.1.0/24登入sshd
[[email protected] ~]# grep access.so /etc/pam.d/sshd
auth required pam_access.so
[[email protected] ~]# vim /etc/security/access.conf
- :root:192.168.122.0/
- :root:ALL EXCEPT 192.168.1.0/
- :root:192.168.122.0/24 EXCEPT 192.168.122.0
示例:使用不同的子產品配置檔案
[[email protected] ~]# grep access /etc/pam.d/login
auth required pam_access.so accessfile=/accessfile
[[email protected] ~]# grep jack /accessfile
- :jack:tty5 tty
============================================================================
[[email protected] ~]# grep access.so /etc/pam.d/sshd
auth requisite pam_access.so accessfile=/accessfile
[[email protected] ~]# grep 110 /accessfile
- :root:ALL EXCEPT 192.168.2.110
子產品:pam_listfile.so
功能:基于自定義檔案允許或拒絕(黑名單或白名單)
示例:vsftpd黑名單或白名單
[[email protected] ~]# grep listfile /etc/pam.d/vsftpd
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers
onerr=succeed
示例:sshd黑名單或白名單
[[email protected] ~]# grep listfile /etc/pam.d/sshd
auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users
onerr=fail
[[email protected] ~]# echo root > /etc/ssh_users
當/etc/ssh_users不存在時,fail
子產品:pam_time.so
功能:基于時間的通路控制,預設檔案/etc/security/time.conf
示例:基于時間限制sshd的通路
[[email protected] ~]# grep time /etc/pam.d/sshd
account required pam_time.so
[[email protected] ~]# grep 0800 /etc/security/time.conf
sshd;*;*;MoTuWeThFr0800-
子產品:pam_tally2.so
功能:登入統計
示例:實作防止對sshd暴力破解
[[email protected] ~]# grep tally2 /etc/pam.d/sshd
auth required pam_tally2.so deny= 2 even_deny_root root_unlock_time=60
unlock_time=60
#deny=2 連續錯誤登入最大次數,超過最大次數,将被鎖定
#even_deny_root root使用者也被要求鎖定
#root_unlock_time root使用者被鎖定後等待的時間,單為秒
#unlock_time 普通使用者被鎖定後等待的時間,單為秒
[[email protected] ~]# pam_tally2 -u root
#檢視使用者錯誤登入次數
[[email protected] ~]# pam_tally2 --reset -u root
#清除使用者錯誤登入次數
PAM資源限制
PAM資源限制主要是對使用者進行系統資源使用的限制
PAM資源限制預設已使用,我們隻需要調整相應限制值即可。
子產品:pam_limits.so
功能:限制使用者會話過程中對各種資源的使用情況。預設情況下該子產品的配置檔案是
/etc/security/limits.conf
/etc/security/limits.d/*.conf
PAM資源限制案例
案例 1 :設定使用者最大打開檔案數
[[email protected] ~]# ulimit -a
[[email protected] ~]# ulimit -n
1024
[[email protected] ~]$ ulimit -n
1024
[[email protected] ~]# vim /etc/security/limits.conf
* soft nofile 10240
* hard nofile 20480
案例 2 :設定使用者最大建立的程序數
[[email protected] ~]$ ulimit -u
1024
[[email protected] ~]# vim /etc/security/limits.d/90-nproc.conf
* soft nproc 10240
* hard nproc 10240
案例 3 :設定使用者jack最大使用CPU的時間
[[email protected] ~]# vim /etc/security/limits.conf
jack hard cpu 1
PAM資源限制針對使用者,不針對程序,如果需要實作程序資源限制,可以考慮使用Cgroup。
擴充:Control Group(CGroup)資源限制組
控制組(CGroups)是Linux核心的一個特性,主要用來對共享資源進行隔離、限制、審計等。隻有能控制配置設定到容 器的資源,才能避免多個容器同時運作時對主控端系統的資源競争。控制組可以提供對容器的記憶體、CPU、磁盤IO等資源進行限制和計費管理。控制組的設計目标是為不同的應用情況提供統一的接口,從控制單一程序(比如nice工具)到系統級虛拟化(包括OpenVZ、Linux-VServer、LXC等)。
具體來看,控制組提供:
資源限制(Resource limiting):可以将組設定為不超過設定的記憶體限制。比如:記憶體子系統可以為程序組設定一個記憶體使用上限,一旦程序組使用的記憶體達到限額再申請記憶體,就會出發Out of Memory警告。 優先級(Prioritization):通過優先級讓一些組優先得到更多的CPU等資源。 資源審計(Accounting):用來統計系統實際上把多少資源用到适合的目的上,可以使用cpuacct子系統記錄某個程序組使用的CPU時間。 隔離(isolation):為組隔離命名空間,這樣一個組不會看到另一個組的程序、網絡連接配接和檔案系統。 控制(Control):挂起、恢複和重新開機動等操作。
cgroups: Control Groups 基于程序的限制,而非使用者,是以對于超戶運作的程序也是一樣
cgroup将各種子系統定義為資源,命名為controller: 可配額/可度量 - Control Groups (cgroups)
cgroups實作了對資源的配額和度量九大子系統的資源
- blkio 限制每個塊裝置的輸入輸出控制。例如:磁盤,CD光牒以及usb
- cpu 限制使用cpu比例
- cpuacct 産生cgroup任務的cpu資源報告。
- cpuset 多核心的cpu時為cgroup任務配置設定單獨的cpu和記憶體
- devices 允許或拒絕對裝置的通路。
- freezer 暫停和恢複cgroup任務。
- memory 設定記憶體限制以及産生記憶體資源報告。
- net_cls 标記每個網絡包。
- ns 名稱空間子系統
例如:對某個程序使用記憶體進行限制步驟:
- 需要在controller memory下建立cgroup,如nginx_mem控制組,并針對該控制組nginx_mem設定相應的記憶體限制參數
- 将程序Nginx配置設定到 memory controller的控制組(nginx_mem),沒有使用controller則不會限制。
Cgroup實作資源限制的方法:
a. cgexec 手動配置設定 b. cgred 自動配置設定
Cgroup部署方法:
[[email protected] ~]#yum -y install libcgroup*
[[email protected] ~]#systemctl enable cgconfig
[[email protected] ~]#systemctl start cgconfig
[[email protected] ~]#man cgconfig.conf
Cgroup限制步驟:
- 建立cgroup,定義相應的限制
- 配置設定程式到cgroup
案例 1 :限制程序使用CPU
- 使用cpu子系統建立兩個cgroup
group lesscpu {
cpu {
cpu.shares=200 ;
}
}
group morecpu {
cpu {
cpu.shares=800 ;
}
}
1 [[email protected] ~]#systemctl restart cgconfig
2.将程式配置設定到相應的group 實驗中,為了讓兩個程序搶CPU時間片,故意隻留一個CPU線上
[[email protected] ~]#lscpu
[[email protected] ~]#echo 0 > /sys/devices/system/cpu/cpu0/online
[[email protected] ~]#echo 1 > /sys/devices/system/cpu/cpu1/online
手動配置設定:
[[email protected] ~]#cgexec -g cpu:lesscpu sha1sum /dev/zero
[[email protected] ~]#cgexec -g cpu:morecpu md5sum /dev/zero
[[email protected] ~]#top
以上三條指令請在三個shell終端中打開,觀察各程序所占用CPU情況。
案例 2 :限制程序使用Memory
- 添加cgroup
group lessmem {
memory {
memory.limit_in_bytes= 268435465 ; //實體記憶體限制256M
}
}
- 建立記憶體盤
[[email protected] ~]# mkdir /mnt/mem_test
[[email protected] ~]#mount -t tmpfs /dev/shm /mnt/mem_test
[[email protected] ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file
bs=1M count=200 //OK
[[email protected] ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file
bs=1M count=500 //OK
[[email protected] ~]#free -m
結果為失敗
- 建立cgroup
group poormem{
memory{
memory.limit_in_bytes=268435465 ; //實體記憶體限制256M
memory.memsw.limit_in_bytes=268435465 ; //總記憶體限制,實體+SWAP
}
}
- 建立記憶體盤并測試
[[email protected] ~]# mkdir /mnt/mem_test
[[email protected] ~]# mount -t tmpfs /dev/shm /mnt/mem_test
[[email protected] ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200 //OK
[[email protected] ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=500 //Fail
[[email protected] ~]#free -m