74、深入解析Linux安全:SELinux与网络安全策略

深入解析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
  1. 将该类型添加到端口47347:
# semanage port -a -t ssh_port_t -p tcp 47347
# semanage port -l | grep ssh
ssh_port_t                tcp             47347, 22
  1. 编辑 /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网络安全防护体系,有效保护系统免受各种网络威胁。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值