深入解析Linux安全:SELinux与网络安全策略
1. SELinux日志审查
SELinux(Security-Enhanced Linux)是增强Linux系统安全性的重要工具,它会记录访问控制(AVC)拒绝信息,这些信息对于排查安全问题至关重要。
1.1 审计日志中的SELinux消息审查
若
auditd
守护进程正在运行,可使用
aureport
命令快速查看是否有AVC拒绝记录。示例如下:
# aureport | grep AVC
Number of AVC's: 1
发现
audit.log
中有AVC拒绝记录后,可使用
ausearch
命令查看拒绝消息:
# ausearch -m avc
type=AVC msg=audit(1580397837.344:274): avc: denied { getattr } for
pid=1067
comm="httpd" path="/var/myserver/services" dev="dm-0" ino=655836
scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0
在AVC拒绝消息中,可关注以下关键词:
-
type=AVC
-
avc: denied
-
comm="httpd"
-
path="/var/myserver/services"
这些信息能帮助我们定位问题,如
/var/myserver/services
目录的SELinux文件上下文错误,导致
httpd
服务无法读取。
1.2 消息日志中的SELinux消息审查
若
auditd
服务正在运行,可使用
grep
搜索
/var/log/audit/audit.log
文件查找AVC拒绝消息。对于最新的RHEL和Fedora系统,或使用
systemd
的Linux系统,也可使用
journalctl
命令:
# journalctl | grep AVC
type=AVC msg=audit(1580397837.346:275): avc: denied { getattr }for
pid=1067
comm="httpd" path="/var/myserver/services" dev="dm-0" ino=655836
scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0
确定存在AVC拒绝后,可将
/var/log/audit/audit.log
文件传递给
sealert
逐步排查问题:
# sealert -a /var/log/audit/audit.log
SELinux is preventing httpd from getattr access on the file
/var/myserver/services.
***** Plugin catchall (100. confidence) suggests *************
If you believe that httpd should be allowed getattr access on the
services file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -X 300 -i my-httpd.pp
Additional Information:
Source Context system_u:system_r:httpd_t:s0
Target Context unconfined_u:object_r:var_t:s0
Target Objects /var/myserver/services [ file ]
...
Raw Audit Messages
type=AVC msg=audit(1580397837.346:275): avc: denied { getattr }
for pid=1067 comm="httpd" path="/var/myserver/services" dev="dm-0"
ino=655836 scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0
Hash: httpd,httpd_t,var_t,file,getattr
若要允许
httpd
服务访问被拒绝的目录内容,可执行上述
ausearch
和
semodule
命令,创建并应用新的SELinux策略。
1.3 SELinux日志故障排除
日志文件对于诊断和解决SELinux策略违规问题极为重要。可通过检查
auditd
、
rsyslogd
和/或
setroubleshootd
守护进程是否运行来确定日志记录是否正常。例如,使用
systemctl status auditd.service
命令检查
auditd
服务状态。若守护进程未运行,需启动它以开始记录日志。
有时,由于
dontaudit
策略规则,AVC拒绝可能未被记录。可使用
semodule -DB
命令临时禁用所有
dontaudit
策略规则。
2. 常见SELinux问题排查
使用SELinux时,常见问题及解决方法如下:
2.1 使用非标准目录
有时,我们会将服务文件存储在非标准目录。例如,将HTML文件存放在
/abc/www/html
而非标准的
/var/www/html
。此时,需让SELinux知晓此非标准行为,可使用以下命令:
# semanage fcontext -a -t httpd_sys_content_t "/abc/www/html(/.*)?"
# restorecon -R -v /abc/www/html
# ls -Z /abc/www/html
unconfined_u:object_r:httpd_sys_content_t:s0 abc
这样,
httpd
守护进程就能访问非标准目录中的HTML文件。
2.2 使用非标准端口
服务监听非标准端口时,可能无法启动。例如,将
sshd
从端口22移至47347,SELinux不知此端口,服务启动失败。解决步骤如下:
1. 查找
sshd
的安全上下文类型:
# semanage port -l | grep ssh
ssh_port_t tcp 22
- 将该类型添加到端口47347:
# semanage port -a -t ssh_port_t -p tcp 47347
# semanage port -l | grep ssh
ssh_port_t tcp 47347, 22
-
编辑
/etc/ssh/sshd_config文件,添加Port 47347行,然后重启sshd服务。
2.3 移动文件丢失安全上下文标签
使用
cp
和
mv
命令移动文件后,文件可能丢失原安全上下文标签。可使用
restorecon
命令恢复:
restorecon file
2.4 布尔值设置错误
布尔值设置错误也会导致AVC拒绝。例如,系统脚本无法连接网络,可检查
httpd
布尔值:
# getsebool -a | grep http
...
httpd_can_network_connect --> off
...
使用以下命令将
httpd_can_network_connect
布尔值设置为
on
:
# setsebool -P httpd_can_network_connect on
3. SELinux实施建议
SELinux较为复杂,实施时可参考以下建议:
- 从宽容操作模式开始,允许SELinux认为不安全的请求成功。
- 在宽容模式下运行系统一段时间,审查日志,根据默认SELinux设置调整布尔值或文件上下文,解决问题后开启强制模式。
- 在测试环境或宽容模式下逐个实施SELinux配置更改,观察每个更改的效果,使用
audit2allow
命令选择性允许被AVC拒绝的操作。
4. 获取更多SELinux信息
可通过以下途径获取SELinux相关信息:
- 系统的
man
页面:使用
man -k selinux
命令查找所有SELinux实用程序的
man
页面。
- Red Hat Enterprise Linux手册:位于
http://docs.redhat.com
。
- Fedora项目SELinux指南:位于
http://docs.fedoraproject.org
。
- SELinux项目Wiki:位于
http://selinuxproject.org
。
5. 网络服务审计
将Linux系统接入网络,尤其是公共网络时,会面临新的安全挑战。大多数企业级Linux系统作为服务器,通过网络为远程客户端提供服务。网络服务是指计算机根据预定义规则通过网络发送和接收信息的任务,如路由电子邮件和提供网页服务。
Linux服务器可提供数千种服务,许多服务信息记录在
/etc/services
文件中。部分内容示例如下:
$ cat /etc/services
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign ...
# Each line describes one service, and is of the form:
#
# service-name port/protocol [aliases ...] [# comment]
...
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
systat 11/udp users
daytime 13/tcp
daytime 13/udp
qotd 17/tcp quote
qotd 17/udp quote
...
chargen 19/tcp ttytst source
chargen 19/udp ttytst source
ftp-data 20/tcp
ftp-data 20/udp
# 21 is registered to ftp, but also used by fsp
ftp 21/tcp
...
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperText Transfer
Protocol
http 80/sctp # HyperText Transfer
Protocol
kerberos 88/tcp kerberos5 krb5 # Kerberos v5
kerberos 88/udp kerberos5 krb5 # Kerberos v5
...
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject
该文件包含三列信息:左列是服务名称,中间列是服务使用的端口号和协议类型,右列是服务的可选别名。
许多Linux发行版默认运行不必要的网络服务,这会使系统面临恶意攻击风险。例如,打印服务器不应同时提供Apache Web服务,以免因Web服务漏洞遭受攻击。
以下是一个简单的流程图,展示SELinux问题排查的基本流程:
graph TD;
A[发现访问拒绝] --> B[检查传统Linux DAC权限];
B --> C{是否为SELinux问题};
C -- 是 --> D[审查SELinux日志];
D --> E{确定问题类型};
E -- 非标准目录 --> F[使用semanage和restorecon命令];
E -- 非标准端口 --> G[查找上下文类型并添加到端口];
E -- 丢失安全上下文标签 --> H[使用restorecon命令恢复];
E -- 布尔值设置错误 --> I[使用getsebool和setsebool命令调整];
C -- 否 --> J[解决传统权限问题];
6. 控制网络服务访问
为了增强Linux系统在网络中的安全性,需要对网络服务的访问进行有效控制。可从以下几个方面着手:
6.1 服务选择
只启用系统必需的网络服务,避免运行不必要的服务。例如,若系统仅作为文件服务器,就无需开启Web服务。可以通过查看
/etc/services
文件了解系统支持的服务,然后根据实际需求,使用系统管理工具(如
systemctl
)来启用或禁用服务。
以下是使用
systemctl
禁用
httpd
服务的示例:
# systemctl stop httpd.service
# systemctl disable httpd.service
6.2 用户认证
对访问网络服务的用户进行严格的认证,防止未经授权的访问。可以使用多种认证方式,如密码认证、密钥认证等。以
sshd
服务为例,可通过修改
/etc/ssh/sshd_config
文件来配置认证方式:
# 禁用密码认证,仅使用密钥认证
PasswordAuthentication no
PubkeyAuthentication yes
修改配置后,重启
sshd
服务使配置生效:
# systemctl restart sshd.service
6.3 访问控制列表(ACL)
使用访问控制列表来限制特定IP地址或IP段对网络服务的访问。例如,可使用
iptables
或
firewalld
来配置ACL。以下是使用
firewalld
允许特定IP地址访问
ssh
服务的示例:
# 允许192.168.1.0/24网段的IP地址访问ssh服务
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
# 重新加载防火墙规则
# firewall-cmd --reload
7. 防火墙的实施
防火墙是保护Linux系统网络安全的重要工具,它可以监控和控制网络流量,阻止未经授权的访问。常见的Linux防火墙有
iptables
和
firewalld
。
7.1 iptables
iptables
是一种基于规则的防火墙,它通过定义一系列规则来过滤网络数据包。以下是一个简单的
iptables
规则示例,用于允许
ssh
和
http
服务的流量,阻止其他所有入站流量:
# 清除所有现有规则
# iptables -F
# 设置默认策略为拒绝所有入站流量
# iptables -P INPUT DROP
# 允许本地回环接口的流量
# iptables -A INPUT -i lo -j ACCEPT
# 允许已建立和相关的连接的流量
# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许ssh服务的流量
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许http服务的流量
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
保存
iptables
规则,使其在系统重启后仍然生效:
# iptables-save > /etc/sysconfig/iptables
7.2 firewalld
firewalld
是一种动态防火墙管理工具,它提供了更高级的功能和更简单的配置方式。以下是使用
firewalld
开放
ssh
和
http
服务的示例:
# 开放ssh服务
# firewall-cmd --permanent --add-service=ssh
# 开放http服务
# firewall-cmd --permanent --add-service=http
# 重新加载防火墙规则
# firewall-cmd --reload
7.3 防火墙配置建议
- 最小权限原则 :只开放系统必需的端口和服务,避免开放不必要的端口。
- 定期审查规则 :定期检查防火墙规则,删除不再需要的规则,确保规则的有效性。
- 备份规则 :定期备份防火墙规则,以防配置丢失或损坏。
8. 总结
Linux系统在网络环境中的安全至关重要,通过合理使用SELinux、审计网络服务、控制网络服务访问和实施防火墙等措施,可以有效增强系统的安全性。
SELinux通过强制访问控制机制,对系统资源的访问进行细粒度的控制,帮助我们发现和解决安全问题。在使用SELinux时,要注意常见问题的排查和解决,如非标准目录、非标准端口、文件安全上下文丢失和布尔值设置错误等。
网络服务审计可以帮助我们了解系统提供的服务,关闭不必要的服务,减少系统的安全风险。控制网络服务访问可以通过服务选择、用户认证和访问控制列表等方式来实现。
防火墙是保护系统网络安全的最后一道防线,合理配置
iptables
或
firewalld
可以有效阻止未经授权的网络流量。
以下是一个总结表格,对比SELinux、网络服务审计、访问控制和防火墙的作用:
| 安全措施 | 作用 |
| ---- | ---- |
| SELinux | 增强系统访问控制,细粒度管理资源访问,排查和解决安全问题 |
| 网络服务审计 | 了解系统服务,关闭不必要服务,降低安全风险 |
| 访问控制 | 限制服务访问,通过服务选择、用户认证和ACL实现 |
| 防火墙 | 监控和控制网络流量,阻止未经授权的访问 |
同时,为了更清晰地展示网络安全防护的整体流程,以下是一个mermaid格式的流程图:
graph LR;
A[Linux系统] --> B[SELinux增强访问控制];
A --> C[网络服务审计];
C --> D[关闭不必要服务];
A --> E[控制网络服务访问];
E --> F[服务选择];
E --> G[用户认证];
E --> H[访问控制列表];
A --> I[实施防火墙];
I --> J[iptables配置];
I --> K[firewalld配置];
B --> L[排查SELinux问题];
L --> M[非标准目录处理];
L --> N[非标准端口处理];
L --> O[安全上下文恢复];
L --> P[布尔值调整];
通过以上综合措施的实施,可以构建一个多层次的Linux网络安全防护体系,有效保护系统免受各种网络威胁。
超级会员免费看
65

被折叠的 条评论
为什么被折叠?



