# 官方提供@yunTaoScripts 系统加固 🔥🔥

loading

# ACL

ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在RWX-UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。

对大于三个用户设置不同权限,传统用户权限实现就比较困难,要实现对具体用户设置权限的话,我们可以考虑ACL。

# 基本使用

acl的用法

setfacl -m u:用户名:rw- file/dir --对用户设置ACL 
setfacl -m g:组名:rw- file/dir --对组设置AC
getfacl file/dir

# 举例

  • 此时yuntao用户无法实现写入bb.txt
[yuntao@VM-0-7-centos ~]$ getfacl bb.txt 
# file: bb.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

[yuntao@VM-0-7-centos ~]$ setfacl -m u:yuntao:rw- bb.txt 
setfacl: bb.txt: Operation not permitted

  • 使用root用户修改acl
[root@VM-0-7-centos ~]# setfacl -m u:yuntao:rw- /home/yuntao/bb.txt 
  • 此时可以实现写入bb.txt
[yuntao@VM-0-7-centos ~]$ getfacl bb.txt 
# file: bb.txt
# owner: root
# group: root
user::rw-
user:yuntao:rw-
group::r--
mask::rw-
other::r--
[yuntao@VM-0-7-centos ~]$ echo "ss"  > bb.txt 

# mask权限

[root@server opt]# getfacl -c aa.txt #这里-c可以去除前几行的注释行
user::rw- ## ACL_USER_OBJ 
user:lduan:rw- ## ACL_USER 
group::r-- ## ACL_GROUP_OBJ 
group:tom:rw- ## ACL_GROUP 
mask::rw- ## ACL_MASK 
other::r--
  • ACL_USER_OBJ-------文件的所有者
  • ACL_USER ----------通过acl授权的用户
  • ACL_GROUP_OBJ -----文件所属组
  • ACL_GROUP----------通过acl授权的组
  • ACL_MASK-----------ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限

结论:

  • 如果没有手动的设置acl的mask权限,则对用户/组 设置的acl权限生效,不用考虑o的权限。
  • 如果手动设置了mask的权限,则用户最终的权限是acl最终权限+other权限的集合。

# acl默认权限

  • 当我们对目录设置acl的时候,还可以设置默认acl权限,语法如下: 设置默认权限
setfacl -m d:u:user1:rwx dir
  • 取消默认权限
setfacl -m d:u:user1:rwx dir

TIP

此处d是default,意思是,不管谁在目录dir里 新建的目录或者文件,对user1 会自动设置acl权 限rwx。

注意

这里的默认权限是对dir里新建的目录或者文件,并非对dir本身 设置权限。

# SELINNX

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。

  • 多了一个点代表开启了selinux
[user1@server1 ~]$ ll
total 0
-rw-rw-r--. 1 user1 user1 0 Jul 25 17:45 y6utnap

# 上下文

在开启了selinux的情况下,selinux会为每个文件、 每个进程都分配一个标签,这个标签我们称之为上 下文(context),后续说标签和上下文是同一个概念, 查看上下文时需要加上Z选项。

  • 查看进程上下文
[root@server1 ~]# ps axuZ | grep httpd
system_u:system_r:httpd_t:s0    root        3024  0.0  0.6 275960 11088 ?        Ss   13:13   0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache      3025  0.0  0.4 289840  8288 ?        S    13:13   0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache      3026  0.0  0.6 1806392 11900 ?       Sl   13:13   0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache      3027  0.0  0.7 1937520 14112 ?       Sl   13:13   0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache      3028  0.0  0.8 1806392 16144 ?       Sl   13:13   0:00 /usr/sbin/httpd -DFOREGROUND
  • 查看文件上下文
[root@server1 xyt]# ls -lZ xaaab 
-rw-r--r--. 1 root root unconfined_u:object_r:admin_home_t:s0 0 Jul 31 12:00 xaaab

提示

特定上下文的进程只能访问特定上下文的文件

  • 添加上下文
[root@server1 ~]# mkdir /www
[root@server1 ~]# ln -s /www/ /var/www/html/xxx
[root@server1 ~]# echo '<h1> hi bro !</h1>' > /www/index.html
[root@server1 ~]# ls -lZ /www/
total 4
-rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 19 Aug 14 14:04 index.html
[root@server1 ~]# ls -lZd /www/
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 24 Aug 14 14:04 /www/
[root@server1 ~]# 

访问无上下文的文件夹无权限

此时访问 xxx/ 时候由于缺少上下导致访问失败。

  • /www 目录增加上下文
[root@server1 ~]# ls -lZ /var/www/html/
total 8
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 11 Aug 14 13:55 haha.html
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 11 Aug 14 13:33 index.html
lrwxrwxrwx. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0  5 Aug 14 14:03 xxx -> /www/
[root@server1 ~]# chcon -R -t httpd_sys_content_t /www/
[root@server1 ~]# ls -lZd /www/
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_sys_content_t:s0 24 Aug 14 14:04 /www/
[root@server1 ~]# ls -lZ /www/
total 4
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 19 Aug 14 14:04 index.html
  • 恢复默认上下文
[root@server1 ~]# restorecon -R /www/
[root@server1 ~]# ls -lZ /www/
total 4
-rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 19 Aug 14 14:04 index.html
[root@server1 ~]# ls -lZd /www/
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 24 Aug 14 14:04 /www/
  • 添加默认上下文
[root@server1 ~]# semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"
[root@server1 ~]# ls -lZ /www/
total 4
-rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 19 Aug 14 14:04 index.html
[root@server1 ~]# ls -lZd /www/
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 24 Aug 14 14:04 /www/
[root@server1 ~]# restorecon -R /www/
[root@server1 ~]# ls -lZd /www/
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_sys_content_t:s0 24 Aug 14 14:04 /www/
[root@server1 ~]# ls -lZ /www/
total 4
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 19 Aug 14 14:04 index.html
  • 修改 和 删除上下文
[root@server1 ~]# semanage fcontext -m -t httpd_sys_content_t "/www(/.*)?"  # 修改上下文
[root@server1 ~]# semanage fcontext -d -t httpd_sys_content_t "/www(/.*)?"  # 删除上下文
[root@server1 ~]# restorecon -R /www/
[root@server1 ~]# ls -lZ /www/
total 4
-rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 19 Aug 14 14:04 index.html
[root@server1 ~]# ls -lZd /www/
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 24 Aug 14 14:04 /www/
[root@server1 ~]# 

# 端口上下文

  • 除了文件存在上下文,端口也存在上下文,
[root@server1 ~]# grep -i listen /etc/httpd/conf/httpd.conf 
# Listen: Allows you to bind Apache to specific IP addresses and/or
# Change this to Listen on specific IP addresses as shown below to 
#Listen 12.34.56.78:80
Listen 80
Listen 880

http 如果启用880端口,但是该端口如果没有上下文,就会导致httpd重启失败。

[root@server1 ~]# journalctl -xe | grep -i selinux
Aug 14 15:01:33 server1.yuntaoscripts.work setroubleshoot[7000]: SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 880.
  • 查看端口上下文,增加端口上下文
[root@server1 ~]# semanage port -l | grep -w 80
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@server1 ~]# semanage port -a -t http_port_t -p tcp 880
[root@server1 ~]# semanage port -l | grep -w 880
http_port_t                    tcp      880, 80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@server1 ~]# systemctl restart httpd.service 

增加端口上下文后,也可通过880端口访问了。

# SELINUX的两种模式

  • selinux一共有2种模式:
    • Enforcing:如果不满足selinux条件,则selinux会阻止访问服务并提供警报
    • Permissive:如果不满足selinux条件,则selinux不阻止访问,但是会警报
  • 两种模式临时切换
[root@server1 ~]# getenforce 
Enforcing
[root@server1 ~]# setenforce 0
[root@server1 ~]# getenforce 
Permissive
[root@server1 ~]# setenforce 1
[root@server1 ~]# getenforce 
Enforcing
  • 设置重启默认值
[root@server1 ~]# cat /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=disabled
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

切换模式注意点

EnforcingPermissive可以在线临时切换,disabled必须要修改配置文件。

# 布尔值

在不开启selinux的情况下,应用的开启由自己的配置文件决定。然而开启selinux后,应用还需要通过selinux的开关才能开启。

  • 查看ftp布尔值为关闭状态
[root@server1 ~]# getsebool -a | grep ftpd_full
ftpd_full_access --> off
[root@server2 ~]# yum list 
AppStream                                                                                             0.0  B/s |   0  B     00:00    
Errors during downloading metadata for repository 'ftpAppStream':
  - Curl error (9): Access denied to remote resource for ftp://192.168.26.129/pub/AppStream/repodata/repomd.xml [Server denied you to change to the given directory]
Error: Failed to download metadata for repo 'ftpAppStream': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
[root@server2 ~]# yum list vsftpd
AppStream                                                                                             104 MB/s | 6.8 MB     00:00    
BaseOS                                                                                                 60 MB/s | 2.3 MB     00:00    
ansible                                                                                               5.1 MB/s |  98 kB     00:00    
Available Packages
vsftpd.x86_64                                                3.0.3-33.el8                                                 ftpAppStream
[root@server2 ~]#
  • 设置ftp布尔值开启
[root@server1 ~]# setsebool ftpd_full_access 1
[root@server1 ~]# setsebool ftpd_full_access on
[root@server1 ~]# getsebool -a | grep ftpd_full
ftpd_full_access --> on
[root@server2 ~]# yum list vsftpd
AppStream                                                                                             104 MB/s | 6.8 MB     00:00    
BaseOS                                                                                                 60 MB/s | 2.3 MB     00:00    
ansible                                                                                               5.1 MB/s |  98 kB     00:00    
Available Packages
vsftpd.x86_64                                                3.0.3-33.el8       

# 防火墙

# zone

  • 获取zone
[root@VM-0-7-centos ~]# firewall-cmd --get-zones
block dmz docker drop external home internal public trusted work
  • 查看网卡关联 zones
[root@VM-0-7-centos ~]# firewall-cmd --get-zone-of-interface=eth0 
no zone
  • 增加删除zone
[root@VM-0-7-centos ~]# firewall-cmd --add-interface=eth0 --zone=public
success
[root@VM-0-7-centos ~]# firewall-cmd --get-zone-of-interface=eth0 
public
[root@VM-0-7-centos ~]# firewall-cmd --remove-interface=eth0 --zone=public
success
[root@VM-0-7-centos ~]# firewall-cmd --get-zone-of-interface=eth0 
no zone

一个网卡无法关联多个zone

网卡 需要 和zone进行关联,网卡不可以和多个zone关联。必须先取消关联。

  • 如果不和任何zone 绑定则使用默认zone
[root@VM-0-7-centos ~]# firewall-cmd --get-default-zone 
trusted
  • 直接切换zone,不需要取消再增加关联
[root@VM-0-7-centos ~]# firewall-cmd --change-interface=eth0 --zone=public
success
[root@VM-0-7-centos ~]# firewall-cmd --get-default-zone 
trusted          
[root@VM-0-7-centos ~]# firewall-cmd --get-zone-of-interface=eth0 
public

# 基本配置

  • 查看指定zone内容
[root@VM-0-7-centos ~]# firewall-cmd --list-all --zone=public 
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

[root@VM-0-7-centos ~]# firewall-cmd --list-all --zone=trusted
trusted
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  • 列出所有支持的服务
[root@VM-0-7-centos ~]# firewall-cmd --get-services 
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
  • 增加zone 内支持的服务
[root@VM-0-7-centos ~]# firewall-cmd --add-service=http --zone=public 
success
[root@VM-0-7-centos ~]# firewall-cmd --list-all --zone=public 
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

提示

可以看到此时 services 字段 增加了http 服务,这样public zone 就支持了 http访问。

  • 查看 服务是否开启
[root@VM-0-7-centos ~]# firewall-cmd --query-service=http --zone=public 
yes
  • 删除服务
[root@VM-0-7-centos ~]# firewall-cmd --remove-service=http --zone=public 
success
[root@VM-0-7-centos ~]# firewall-cmd --query-service=http --zone=public 
no
  • 配置重启生效
[root@VM-0-7-centos ~]# firewall-cmd --add-service=http --zone=public --permanent
success
[root@VM-0-7-centos ~]# firewall-cmd --reload 
success
[root@VM-0-7-centos ~]# firewall-cmd --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  • 放通端口
[root@VM-0-7-centos ~]# firewall-cmd --add-port=880/tcp --permanent --zone=public 
success
[root@VM-0-7-centos ~]# firewall-cmd --reload 
success
[root@VM-0-7-centos ~]# firewall-cmd --query-port=880/tcp --zone=public 
yes
[root@VM-0-7-centos ~]# firewall-cmd --list-all --zone=public 
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client http ssh
  ports: 880/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:
  • 放通删除端口段
firewall-cmd --add-port=880-900/tcp --permanent --zone=public
firewall-cmd --remove-port=880-900/tcp --permanent --zone=public

# 富规则的使用

可以针对特定ip实现 端口放行。

  • 放行服务的语法:
firewall-cmd --add-rich-rule='rule family=ipv4 source address=源网段 service name=服务名 accept'
  • 放行端口的语法:
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=源网段 port port=N protocol=协议 accept'
  • 记忆技巧
man -k firewall
man firewalld.richlanguage 搜索EXAMPLE
最后修改时间: 12/31/2022, 12:00:03 PM