# 官方提供@yunTaoScripts 系统加固 🔥🔥
# 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
切换模式注意点
Enforcing
和Permissive
可以在线临时切换,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
← 快速链接