《Linux基础知识-4》
Linux基础知识-4
10. Linux 安全管理
Linux 安全管理涵盖了用户认证与授权、系统安全基础、防火墙配置、安全强化、日志审计与入侵检测以及SSH配置与加固等多个方面。通过合理配置和管理这些安全组件,系统管理员可以有效地保护系统免受未授权访问和潜在的网络攻击,确保系统的稳定性与安全性。以下内容将详细介绍各个子章节,帮助您全面掌握Linux安全管理的核心知识和实用技能。
10.1 用户认证与授权
用户认证与授权是确保只有经过授权的用户才能访问系统资源的关键机制。合理配置用户权限和访问控制策略,可以有效防止未经授权的访问和潜在的安全威胁。
10.1.1 配置 sudo
权限
sudo
(Super User Do)允许授权用户以超级用户或其他用户的身份执行命令,提升了系统管理的灵活性和安全性。
添加用户到 sudo
组
在多数Linux发行版中,sudo
权限通过将用户添加到特定的组(如 sudo
或 wheel
)来管理。
步骤:
-
添加用户到
sudo
组sudo usermod -aG sudo username
说明:
-aG
:将用户追加到指定组,而不从其他组中移除。sudo
:目标组名称。username
:要添加到组的用户名。
-
验证用户是否已添加到
sudo
组groups username
示例输出:
username : username sudo
编辑 /etc/sudoers
文件(使用 visudo
)
直接编辑 /etc/sudoers
文件可以细化和定制 sudo
权限配置。为了避免语法错误,建议使用 visudo
工具进行编辑。
步骤:
-
打开
sudoers
文件sudo visudo
-
配置全局
sudo
权限在文件中添加以下行,允许
sudo
组的所有成员拥有sudo
权限:%sudo ALL=(ALL:ALL) ALL
-
配置特定用户或组的
sudo
权限为特定用户赋予
sudo
权限:username ALL=(ALL) ALL
为特定组赋予
sudo
权限:%admin ALL=(ALL) ALL
-
配置
NOPASSWD
选项NOPASSWD
选项允许用户在使用sudo
时不需要输入密码。谨慎使用此选项,以免降低系统安全性。示例:
username ALL=(ALL) NOPASSWD:ALL
或为整个组配置:
%sudo ALL=(ALL) NOPASSWD:ALL
注意事项:
- 始终使用
visudo
进行编辑,以确保文件语法正确。 - 最小化授予
NOPASSWD
权限的用户数量,遵循最小权限原则。
10.1.2 配置用户组与访问控制
用户组与访问控制(Access Control)允许系统管理员对文件和目录的访问权限进行精细管理,确保只有特定用户或组能够访问敏感资源。
创建与管理用户组
创建新用户组
sudo groupadd groupname
示例:
sudo groupadd developers
将用户添加到用户组
sudo usermod -aG groupname username
示例:
sudo usermod -aG developers alice
验证用户所属组
groups username
示例输出:
alice : alice developers sudo
设置组权限
通过修改文件的所属组和设置组权限,可以控制特定组的访问权限。
使用 chgrp
修改文件所属组
sudo chgrp groupname /path/to/file
示例:
sudo chgrp developers /var/www/html/index.html
使用 chmod
设置组权限
r
:读取权限w
:写入权限x
:执行权限
示例:
sudo chmod 750 /var/www/html/index.html
说明:
7
(所有者):读、写、执行5
(组):读、执行0
(其他):无权限
设置目录及其子目录的组权限
sudo chmod -R 750 /var/www/html/
使用 ACL(访问控制列表)
ACL 提供了比传统 Unix 权限更细粒度的权限控制,允许为单个用户或组设置特定的权限。
安装 ACL 工具(如 acl
)
在Debian/Ubuntu:
sudo apt install acl
在CentOS/RHEL:
sudo yum install acl
使用 setfacl
设置 ACL 规则
基本语法:
setfacl -m u:username:permissions /path/to/file
setfacl -m g:groupname:permissions /path/to/file
示例:
-
为用户
bob
赋予读取和写入权限:sudo setfacl -m u:bob:rw /var/www/html/index.html
-
为组
developers
赋予读取权限:sudo setfacl -m g:developers:r /var/www/html/index.html
使用 getfacl
查看 ACL 规则
基本用法:
getfacl /path/to/file
示例:
getfacl /var/www/html/index.html
示例输出:
# file: var/www/html/index.html
# owner: alice
# group: developers
user::rw-
user:bob:rw-
group::r--
mask::rw-
other::---
说明:
user::
:文件所有者的权限user:bob:
:特定用户bob
的权限group::
:文件所属组的权限mask::
:最大权限other::
:其他用户的权限
10.2 系统安全基础
系统安全基础涉及防火墙配置和系统安全强化。通过配置防火墙,可以有效控制网络流量;通过安全强化措施,如SELinux和AppArmor,可以增强系统的安全性和稳定性。
10.2.1 防火墙配置
防火墙是网络安全的第一道防线,通过定义规则来控制进入和离开的网络流量,防止未授权访问和潜在的网络攻击。
10.2.1.1 iptables
iptables
是 Linux 内核的一个用户空间工具,用于配置和管理网络包过滤规则。虽然现代发行版逐渐转向更高级的工具(如 firewalld
或 ufw
),但了解 iptables
的基础知识仍然十分重要。
基本概念与链(INPUT, OUTPUT, FORWARD)
-
表(Table):
iptables
使用不同的表来处理不同类型的规则,如filter
(默认)、nat
、mangle
。 -
链(Chain)
:每个表包含多个链,链是规则的有序列表。主要链包括:
- INPUT:处理进入系统的数据包。
- OUTPUT:处理从系统发送出去的数据包。
- FORWARD:处理通过系统转发的数据包。
添加与删除规则
添加规则
sudo iptables -A CHAIN -p protocol --dport port -j ACTION
示例:允许所有来自本地回环接口的流量
sudo iptables -A INPUT -i lo -j ACCEPT
示例:允许SSH(端口22)流量
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
删除规则
sudo iptables -D CHAIN -p protocol --dport port -j ACTION
示例:删除允许SSH(端口22)流量的规则
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
保存与恢复规则
iptables
规则在系统重启后不会自动保留,需要手动保存和恢复。
保存规则
在Debian/Ubuntu:
sudo apt install iptables-persistent
sudo netfilter-persistent save
在CentOS/RHEL:
sudo service iptables save
恢复规则
在Debian/Ubuntu:
sudo netfilter-persistent reload
在CentOS/R
HEL:
sudo systemctl enable iptables
sudo systemctl start iptables
常用规则示例
默认策略设置
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
允许已建立和相关的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许HTTP和HTTPS流量
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
拒绝所有其他流量
sudo iptables -A INPUT -j DROP
保存规则
sudo iptables-save | sudo tee /etc/iptables/rules.v4
10.2.1.2 ufw
ufw
(Uncomplicated Firewall)是一个用户友好的防火墙管理工具,简化了 iptables
的配置过程,特别适用于Debian和Ubuntu系统。
基本用法
启用 ufw
sudo ufw enable
禁用 ufw
sudo ufw disable
查看 ufw
状态
sudo ufw status verbose
常用命令与配置
允许特定端口
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
拒绝特定端口
sudo ufw deny 23/tcp
允许特定IP访问端口
sudo ufw allow from 192.168.1.100 to any port 22
删除规则
sudo ufw delete allow 22/tcp
启用日志记录
sudo ufw logging on
示例与应用场景
示例1:设置基本防火墙规则
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
应用场景:
- Web服务器配置:允许HTTP和HTTPS流量,确保Web服务正常运行。
- 开发环境:允许SSH访问,禁止其他入站流量,确保远程管理的安全性。
10.2.1.3 firewalld
firewalld
是一个动态防火墙管理工具,提供了更高级和灵活的防火墙配置方式,支持区域和服务的概念,适用于CentOS、RHEL和Fedora等发行版。
基本概念与用法
- 区域(Zone):定义不同的信任级别,适用于不同的网络环境(如家庭网络、公共网络)。
- 服务(Service):预定义的一组防火墙规则,简化常见服务(如HTTP、SSH)的配置。
- 持久性:防火墙规则可以在运行时动态调整,而无需重启服务。
配置区域与服务
查看当前区域
sudo firewall-cmd --get-active-zones
示例输出:
publicinterfaces: eth0
查看区域中的服务
sudo firewall-cmd --zone=public --list-services
示例输出:
ssh dhcpv6-client
添加服务到区域
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --reload
移除服务从区域
sudo firewall-cmd --zone=public --remove-service=ssh --permanent
sudo firewall-cmd --reload
允许特定端口
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
常用命令与示例
查看所有可用区域
sudo firewall-cmd --get-zones
查看所有可用服务
sudo firewall-cmd --get-services
允许SSH连接
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reload
拒绝HTTP流量
sudo firewall-cmd --zone=public --remove-service=http --permanent
sudo firewall-cmd --reload
实时监控防火墙状态
sudo firewall-cmd --state
应用场景:
- 企业网络:使用不同的区域配置内外网络流量,提高网络安全性。
- 动态环境:根据网络环境的变化,动态添加或移除服务规则,确保系统灵活应对。
10.2.2 安全强化
安全强化措施通过限制系统和应用程序的权限和行为,减少潜在的攻击面,提升系统的整体安全性。
10.2.2.1 SELinux
SELinux(Security-Enhanced Linux)是一个内核模块,提供强制访问控制(MAC)机制,增强系统的安全性。
基本概念与模式(Enforcing, Permissive, Disabled)
- Enforcing:SELinux 强制执行策略,阻止未授权的访问并记录日志。
- Permissive:SELinux 不阻止访问,但会记录警告信息,适用于调试和策略制定。
- Disabled:完全禁用 SELinux,不进行任何安全策略的应用。
查看 SELinux 状态
sestatus
示例输出:
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
配置与管理 SELinux 策略
更改 SELinux 模式
# 临时更改模式
sudo setenforce 0 # Permissive
sudo setenforce 1 # Enforcing# 永久更改模式
sudo nano /etc/selinux/config
编辑 /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=enforcing
SELINUXTYPE=targeted
安装并管理 SELinux 工具
sudo yum install policycoreutils selinux-policy-targeted
创建自定义 SELinux 策略
创建和管理自定义策略需要深入理解SELinux的策略语言和上下文。以下是一个简单的示例,展示如何为新服务创建策略。
示例:为自定义服务创建 SELinux 策略
-
创建策略文件
nano myservice.te
内容:
module myservice 1.0;require {type httpd_t;class tcp_socket name_bind; }# Allow myservice to bind to port 8080 allow httpd_t self:tcp_socket name_bind;
-
编译并安装策略
sudo checkmodule -M -m -o myservice.mod myservice.te sudo semodule_package -o myservice.pp -m myservice.mod sudo semodule -i myservice.pp
常用命令与示例
-
查看 SELinux 上下文
ls -Z /path/to/file
示例:
ls -Z /var/www/html/index.html
-
更改文件的 SELinux 上下文
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
-
恢复默认上下文
sudo restorecon -v /var/www/html/index.html
应用场景:
- Web服务器安全:使用SELinux限制Web服务器的文件访问权限,防止潜在的文件泄露和篡改。
- 自定义服务安全:为自定义开发的服务配置SELinux策略,确保其只能执行特定的操作。
10.2.2.2 AppArmor
AppArmor(Application Armor)是另一种Linux安全模块,提供基于路径的访问控制,旨在简化和增强系统的安全性。
基本概念与作用
- 基于路径的访问控制:AppArmor通过配置文件定义应用程序可以访问的资源和权限。
- 配置文件:每个受保护的程序都有一个AppArmor配置文件,通常位于
/etc/apparmor.d/
目录下。
查看 AppArmor 状态(aa-status
)
sudo aa-status
示例输出:
apparmor module is loaded.
22 profiles are loaded.
22 profiles are in enforce mode.
0 profiles are in complain mode.
0 processes have a profile defined.
配置与管理 AppArmor 配置文件
编辑 AppArmor 配置文件
sudo nano /etc/apparmor.d/usr.sbin.nginx
示例内容:
# Profile for Nginx web server
/usr/sbin/nginx {# Include common AppArmor abstractions#include <abstractions/base>#include <abstractions/nginx>/var/www/** r,/var/log/nginx/** rw,/etc/nginx/** r,/usr/share/nginx/html/** r,/usr/sbin/nginx mr,
}
添加新配置文件
为新应用程序创建配置文件:
sudo nano /etc/apparmor.d/usr.bin.myapp
示例内容:
# Profile for MyApp
/usr/bin/myapp {# Include common AppArmor abstractions#include <abstractions/base>/etc/myapp/** r,/var/log/myapp/** rw,/usr/bin/myapp mr,
}
常用命令与示例
-
启用 AppArmor
sudo systemctl enable apparmor sudo systemctl start apparmor
-
加载配置文件
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
-
禁用配置文件
sudo aa-disable /etc/apparmor.d/usr.sbin.nginx
-
重新加载 AppArmor 配置
sudo systemctl reload apparmor
应用场景:
- Web服务器安全:限制Web服务器的文件访问权限,防止潜在的文件泄露和篡改。
- 数据库安全:为数据库服务配置严格的访问控制,确保数据的完整性和保密性。
- 自定义应用程序安全:为自定义开发的应用程序创建AppArmor配置文件,限制其操作范围,防止滥用。
10.3 日志审计与入侵检测
日志审计与入侵检测是系统安全管理的重要组成部分,通过记录和分析系统日志,可以及时发现并应对潜在的安全威胁和入侵行为。
10.3.1 配置和管理安全日志
安全日志记录了系统的关键事件和活动,是审计和安全监控的基础。合理配置日志记录级别和权限,确保日志的完整性和可用性。
设置日志记录级别
日志记录级别决定了系统记录哪些类型的事件和信息。不同的日志记录级别适用于不同的安全需求。
步骤:
-
编辑
rsyslog
配置文件sudo nano /etc/rsyslog.conf
-
配置不同级别的日志记录
示例:
# 记录所有紧急级别及以上的日志到 /var/log/critical.log *.emerg /var/log/critical.log# 记录警告级别及以上的日志到 /var/log/warnings.log *.warn /var/log/warnings.log# 记录所有信息级别及以上的日志到 /var/log/syslog *.* /var/log/syslog
-
重启
rsyslog
服务sudo systemctl restart rsyslog
常用日志级别:
emerg
:紧急,系统不可用。alert
:需要立即采取措施。crit
:严重错误。err
:错误。warning
:警告。notice
:正常但重要的信息。info
:信息。debug
:调试信息。
管理日志文件权限
确保日志文件的所有者和权限设置正确,防止未授权的访问和篡改。
设置日志文件的所有者与权限
sudo chown root:adm /var/log/syslog
sudo chmod 640 /var/log/syslog
说明:
root:adm
:设置所有者为root
,所属组为adm
(通常用于管理日志的用户组)。640
:所有者具有读写权限,组用户具有读取权限,其他用户无权限。
使用 chown
与 chmod
修改权限
# 修改文件所属组
sudo chgrp adm /var/log/auth.log# 设置文件权限
sudo chmod 640 /var/log/auth.log
最佳实践:
- 仅授权的用户和组能够读取和管理日志文件。
- 定期审查日志文件的权限,确保其符合安全策略。
10.3.2 使用 fail2ban
防止暴力破解
fail2ban
是一个入侵防御软件,监控日志文件中的可疑活动(如多次失败的登录尝试),并自动采取措施(如封禁IP地址),防止暴力破解攻击。
安装与启用 fail2ban
在Debian/Ubuntu上安装 fail2ban
sudo apt update
sudo apt install fail2ban
在CentOS/RHEL上安装 fail2ban
sudo yum install epel-release
sudo yum install fail2ban
启用并启动 fail2ban
服务
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
配置监控规则
fail2ban
使用“监狱”(jails)来定义监控规则,每个监狱对应一个服务(如SSH、HTTP)。
步骤:
-
复制默认配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
-
编辑
jail.local
文件sudo nano /etc/fail2ban/jail.local
-
配置监控服务(如
sshd
)示例:配置
sshd
监狱[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 600
-
配置防护参数
maxretry
:允许的最大失败尝试次数。bantime
:封禁时间(秒)。
示例:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 600
-
重启
fail2ban
服务应用更改sudo systemctl restart fail2ban
应用场景与案例
防止 SSH 暴力破解
通过配置 fail2ban
监控 sshd
日志,可以自动封禁多次失败的SSH登录尝试,防止暴力破解攻击。
示例:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 600
防止 HTTP 暴力破解
同样,可以为Web服务器(如Apache、Nginx)配置 fail2ban
监控特定的日志文件,防止HTTP暴力破解攻击。
示例:配置 nginx
监狱
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 600
步骤:
-
创建
nginx-http-auth
过滤器sudo nano /etc/fail2ban/filter.d/nginx-http-auth.conf
内容:
[Definition] failregex = no user/password was provided for basic authentication.*client: <HOST> ignoreregex =
-
编辑
jail.local
文件sudo nano /etc/fail2ban/jail.local
添加以下内容:
[nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 3 bantime = 600
-
重启
fail2ban
服务sudo systemctl restart fail2ban
应用场景:
- 增强远程访问安全:通过自动封禁可疑IP地址,减少暴力破解攻击的成功率。
- 保护Web应用:防止针对Web应用的暴力登录尝试,确保应用程序的安全性。
10.4 SSH 配置与加固
SSH(Secure Shell)是Linux系统中常用的远程访问协议,通过合理配置和加固,可以显著提升系统的远程访问安全性,防止未授权的访问和潜在的安全威胁。
10.4.1 配置密钥认证
密钥认证提供了一种比密码更安全的SSH登录方式,防止密码泄露和暴力破解攻击。
生成 SSH 密钥对
使用 ssh-keygen
命令生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
说明:
-t rsa
:指定密钥类型为RSA。-b 4096
:生成4096位密钥。-C "comment"
:为密钥添加注释(通常为电子邮件)。
示例输出:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/alice/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/alice/.ssh/id_rsa
Your public key has been saved in /home/alice/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
| |
| . |
| o + |
| o + + |
| . + = S |
| + + * |
| . = = . |
| . + . |
| E |
+-----------------+
配置服务器端与客户端
将公钥复制到服务器
使用 ssh-copy-id
命令将公钥复制到远程服务器的 authorized_keys
文件中:
ssh-copy-id username@remote_host
示例:
ssh-copy-id alice@192.168.1.100
手动复制公钥
如果 ssh-copy-id
不可用,可以手动复制公钥:
-
复制公钥内容
cat ~/.ssh/id_rsa.pub
-
在服务器上创建
~/.ssh
目录并设置权限ssh username@remote_host mkdir -p ~/.ssh chmod 700 ~/.ssh
-
将公钥添加到
authorized_keys
文件echo "your_public_key_contents" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
配置 ~/.ssh/authorized_keys
文件权限
确保 authorized_keys
文件和 .ssh
目录的权限正确,以防止未授权的访问。
设置权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
示例:
ssh username@remote_host
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
测试密钥认证
使用私钥进行登录
ssh username@remote_host
验证无密码登录
如果配置正确,应该无需输入密码即可登录。
示例:
ssh alice@192.168.1.100
输出:
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-104-generic x86_64)
...
alice@remote_host:~$
10.4.2 禁用密码登录,配置防火墙
通过禁用密码登录,只允许使用密钥认证,可以显著提升SSH登录的安全性,防止密码暴力破解攻击。
编辑 SSH 配置文件 /etc/ssh/sshd_config
步骤:
-
打开配置文件
sudo nano /etc/ssh/sshd_config
-
禁用密码认证
找到并修改以下行:
PasswordAuthentication no
-
禁用 Root 用户登录
找到并修改以下行:
PermitRootLogin no
-
禁用不必要的SSH选项
禁用 X11 转发
X11Forwarding no
限制特定用户登录
AllowUsers alice bob
保存并关闭文件。
配置防火墙规则允许 SSH 连接
确保防火墙允许SSH端口(默认22)的流量,以便远程访问。
使用 ufw
配置
sudo ufw allow ssh
使用 firewalld
配置
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
使用 iptables
配置
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
保存 iptables
规则
sudo iptables-save | sudo tee /etc/iptables/rules.v4
重启 SSH 服务应用更改
命令:
sudo systemctl restart sshd
验证配置:
重新连接SSH,确保只允许密钥认证:
ssh username@remote_host
禁用不必要的 SSH 选项
禁用 X11 转发
在 /etc/ssh/sshd_config
文件中设置:
X11Forwarding no
限制用户登录
在 /etc/ssh/sshd_config
文件中设置:
AllowUsers alice bob
其他安全选项:
-
更改默认端口
步骤:
-
编辑配置文件
sudo nano /etc/ssh/sshd_config
-
更改端口号
Port 2222
-
更新防火墙规则
使用
ufw
:sudo ufw allow 2222/tcp sudo ufw delete allow ssh
使用
firewalld
:sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --permanent --remove-service=ssh sudo firewall-cmd --reload
-
重启 SSH 服务
sudo systemctl restart sshd
-
-
启用 TCP Wrappers
步骤:
-
编辑
/etc/hosts.allow
文件sudo nano /etc/hosts.allow
添加规则:
sshd: 192.168.1.0/24
-
编辑
/etc/hosts.deny
文件sudo nano /etc/hosts.deny
添加规则:
sshd: ALL
-
应用场景:
- 高安全性服务器:通过仅允许特定用户和IP地址访问SSH,增强服务器安全性。
- 分布式系统:在多个服务器间实施严格的SSH访问控制,确保只有授权用户能够访问关键节点。
总结
Linux安全管理是确保系统稳定性和数据安全的关键环节。通过合理配置用户认证与授权、防火墙、SELinux/AppArmor、安全日志审计以及SSH加固,系统管理员可以构建一个安全、可靠的Linux环境。以下是基于具体实例的应用总结:
-
配置
sudo
权限将用户
alice
添加到sudo
组:sudo usermod -aG sudo alice sudo visudo # 添加以下行以赋予sudo组成员权限 %sudo ALL=(ALL:ALL) ALL
-
创建并管理用户组
创建
developers
组并将用户bob
添加到该组:sudo groupadd developers sudo usermod -aG developers bob groups bob # 输出:bob : bob developers sudo
-
设置文件组权限
修改
/var/www/html/index.html
文件的所属组为developers
并设置组权限:sudo chgrp developers /var/www/html/index.html sudo chmod 750 /var/www/html/index.html
-
使用 ACL 赋予用户特定权限
为用户
charlie
赋予/var/www/html/index.html
的读取和写入权限:sudo setfacl -m u:charlie:rw /var/www/html/index.html getfacl /var/www/html/index.html
-
配置
iptables
允许SSH和HTTP流量sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -j DROP sudo iptables-save | sudo tee /etc/iptables/rules.v4
-
使用
ufw
设置防火墙规则sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh sudo ufw allow http sudo ufw allow https sudo ufw enable
-
启用并配置 SELinux
查看SELinux状态:
sestatus
将SELinux模式设置为
enforcing
:sudo setenforce 1 sudo nano /etc/selinux/config # 设置 SELINUX=enforcing sudo systemctl restart sshd
-
配置 AppArmor 保护Nginx
创建
/etc/apparmor.d/usr.sbin.nginx
文件:/usr/sbin/nginx {#include <abstractions/base>#include <abstractions/nginx>/var/www/** r,/var/log/nginx/** rw,/etc/nginx/** r,/usr/share/nginx/html/** r,/usr/sbin/nginx mr, }
加载并启用配置:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx sudo systemctl reload apparmor
-
配置并管理
fail2ban
防止暴力破解安装并启用
fail2ban
:sudo apt install fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban
配置
sshd
监狱:[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 600
重启
fail2ban
服务:sudo systemctl restart fail2ban
-
配置SSH密钥认证并禁用密码登录
生成密钥对并复制公钥到服务器:
ssh-keygen -t rsa -b 4096 -C "alice@example.com" ssh-copy-id alice@192.168.1.100
编辑
/etc/ssh/sshd_config
文件:PasswordAuthentication no PermitRootLogin no X11Forwarding no AllowUsers alice bob
重启SSH服务:
sudo systemctl restart sshd
11. Linux 性能监控与优化
Linux 系统的性能监控与优化是确保系统高效、稳定运行的关键环节。通过实时监控系统资源使用情况,识别性能瓶颈,系统管理员可以采取相应的优化措施,提升系统整体性能和响应速度。本文将详细介绍系统资源监控的方法和工具,以及针对 CPU、内存、磁盘和网络等关键资源的性能优化策略。此外,还将探讨日志与系统监控工具的使用,帮助您实现全面的性能监控与优化。
11.1 系统资源监控
系统资源监控是了解系统当前状态、发现潜在问题的基础。通过监控 CPU、内存、磁盘和网络等资源的使用情况,可以及时发现资源瓶颈,采取优化措施。
11.1.1 查看 CPU 使用率
CPU 使用率是衡量系统负载的重要指标。高 CPU 使用率可能导致系统响应缓慢甚至崩溃。
使用 top
和 htop
top
和 htop
是最常用的实时系统监控工具,用于查看系统的 CPU、内存、进程等使用情况。
-
实时监控 CPU 使用情况
top
命令top
是一个命令行工具,默认安装在大多数 Linux 发行版中。top
htop
命令htop
是top
的增强版,提供了更友好的用户界面和更多的功能。sudo apt install htop # Debian/Ubuntu sudo yum install htop # CentOS/RHEL sudo dnf install htop # Fedora
htop
比较
top
和htop
top
:简洁、基本功能,适合快速查看系统状态。htop
:彩色界面、支持鼠标操作、可视化显示,更适合深入分析。
-
识别高 CPU 使用进程
在
top
或htop
中,按%CPU
列排序,可以快速找到消耗 CPU 资源最多的进程。示例(使用
top
):-
启动
top
:top
-
按
%CPU
列排序:在
top
界面中,按P
键可以按 CPU 使用率排序。 -
识别高 CPU 使用进程:
查看顶部列出的进程,找出消耗大量 CPU 的应用程序或服务。
示例(使用
htop
):-
启动
htop
:htop
-
按
%CPU
排序:按
F6
键,选择%CPU
作为排序依据。 -
识别高 CPU 使用进程:
查看顶部的进程列表,找出高负载进程。
-
使用 mpstat
查看多核 CPU 性能
mpstat
是 sysstat
包中的一个工具,用于报告各个 CPU 核心的使用情况,适用于多核系统的详细性能分析。
-
安装与基本用法
sudo apt install sysstat # Debian/Ubuntu sudo yum install sysstat # CentOS/RHEL sudo dnf install sysstat # Fedora
启用
sysstat
数据收集:sudo sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat sudo systemctl restart sysstat
查看所有 CPU 核心的使用情况
mpstat -P ALL 1 5
说明:
-P ALL
:显示所有 CPU 核心的信息。1
:每隔1秒采样一次。5
:采样5次。
-
解释
mpstat
输出Linux 5.4.0-104-generic (hostname) 04/27/2024 _x86_64_ (8 CPU)04:00:01 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 04:00:02 PM all 5.00 0.00 3.00 0.50 0.00 0.00 0.00 0.00 0.00 91.50 04:00:02 PM 0 6.00 0.00 4.00 0.60 0.00 0.00 0.00 0.00 0.00 89.40 04:00:02 PM 1 4.00 0.00 2.00 0.40 0.00 0.00 0.00 0.00 0.00 93.60 ...
字段说明:
%usr
:用户空间占用的 CPU 百分比。%sys
:内核空间占用的 CPU 百分比。%iowait
:等待 I/O 操作的 CPU 百分比。%idle
:空闲 CPU 百分比。
示例解释:
all
行显示所有 CPU 核心的平均使用情况。- 每个核心(如
0
,1
, …)的详细使用情况。
11.1.2 查看内存使用
内存使用情况直接影响系统性能。合理的内存管理和监控可以防止内存不足导致的系统缓慢或崩溃。
使用 free
查看内存状态
free
是一个简单的命令,用于显示系统的内存使用情况,包括物理内存、交换空间和缓存。
-
基本用法
free
-
常用选项
-h
:以人类可读的格式显示(如 MB、GB)。-m
:以 MB 为单位显示。-g
:以 GB 为单位显示。
示例:
free -h
示例输出:
total used free shared buff/cache available Mem: 16G 4.2G 2.1G 512M 9.7G 11G Swap: 8G 0B 8G
-
理解内存使用的各个部分
- total:总物理内存。
- used:已使用的内存。
- free:空闲的内存。
- shared:多个进程共享使用的内存。
- buff/cache:用于缓冲和缓存的内存。
- available:可供新进程使用的内存。
注意事项:
buff/cache
中的内存可被回收利用,available
更能准确反映系统实际可用内存。
使用 vmstat
分析内存与交换空间
vmstat
(Virtual Memory Statistics)提供了系统内存、进程、分页、块 I/O 等的统计信息,适用于深入分析内存和交换空间的使用情况。
-
基本用法
vmstat
-
常用选项
-s
:以统计摘要形式显示信息。-m
:显示 slab 信息。1 5
:每隔1秒采样一次,共5次。
示例:
vmstat 1 5
示例输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 2147484 524288 8388608 0 0 0 0 45 78 5 2 93 0 01 0 0 2147484 524288 8388608 0 0 0 0 30 55 3 1 96 0 00 0 0 2147484 524288 8388608 0 0 0 0 50 100 4 2 94 0 01 0 0 2147484 524288 8388608 0 0 0 0 35 70 6 3 91 0 00 0 0 2147484 524288 8388608 0 0 0 0 40 80 5 2 93 0 0
字段说明:
- procs
r
:运行队列中的进程数。b
:等待 I/O 的进程数。
- memory
swpd
:已使用的交换空间(KB)。free
:空闲内存(KB)。buff
:缓冲区使用的内存(KB)。cache
:缓存使用的内存(KB)。
- swap
si
:从交换空间交换到内存的数据量(KB/s)。so
:从内存交换到交换空间的数据量(KB/s)。
- io
bi
:块设备读取数据量(块/s)。bo
:块设备写入数据量(块/s)。
- system
in
:每秒中断数。cs
:每秒上下文切换数。
- cpu
us
:用户空间占用的 CPU 百分比。sy
:内核空间占用的 CPU 百分比。id
:空闲 CPU 百分比。wa
:等待 I/O 的 CPU 百分比。st
:被虚拟机偷走的 CPU 百分比。
解释
vmstat
输出- 高
si
和so
表示交换活动频繁,可能是内存不足。 - 高
wa
表示 I/O 等待时间长,可能是磁盘性能瓶颈。 - 高
r
表示系统负载较高,可能需要优化进程或增加 CPU。
使用 top
监控内存使用
top
不仅可以监控 CPU 使用情况,还能实时显示内存和交换空间的使用情况,帮助识别内存泄漏和高内存使用的进程。
-
查看内存使用情况
启动
top
:top
内存部分示例输出:
KiB Mem : 16384000 total, 2100000 free, 4200000 used, 10084000 buff/cache KiB Swap: 8388608 total, 8388608 free, 0 used. 10400000 avail Mem
-
识别内存泄漏进程
-
排序进程按内存使用量
在
top
界面中,按M
键可以按内存使用量排序。 -
监控高内存使用进程
观察持续占用大量内存的进程,确认是否存在内存泄漏。
示例:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1234 alice 20 0 500000 300000 20000 S 5.0 1.8 10:00.00 myapp
在此示例中,
myapp
进程占用了 1.8% 的内存,持续监控其内存使用是否异常增长。 -
11.1.3 磁盘使用
磁盘使用情况影响系统的存储能力和读写性能。通过监控磁盘空间和 I/O 活动,可以防止磁盘满溢和性能瓶颈。
使用 df
查看磁盘空间
df
(Disk Free)命令用于显示文件系统的磁盘空间使用情况。
-
基本用法
df
-
常用选项
-h
:以人类可读的格式显示(如 GB、MB)。-T
:显示文件系统类型。-i
:显示 inode 使用情况。
示例:
df -hT
示例输出:
Filesystem Type Size Used Avail Use% Mounted on /dev/sda1 ext4 50G 20G 28G 42% / tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm /dev/sdb1 xfs 100G 60G 40G 60% /data
-
理解各分区的使用情况
- Filesystem:文件系统名称或设备。
- Type:文件系统类型(如 ext4, xfs)。
- Size:总大小。
- Used:已使用空间。
- Avail:可用空间。
- Use%:使用百分比。
- Mounted on:挂载点。
使用 du
分析目录占用
du
(Disk Usage)命令用于估算文件和目录的磁盘使用量,帮助识别占用大量空间的目录或文件。
-
基本用法
du /path/to/directory
-
常用选项
-h
:以人类可读的格式显示。-s
:显示总计。-d N
:显示到 N 级深度的目录。--max-depth=N
:与-d
类似,指定最大目录深度。
示例:
du -sh /var/log
示例输出:
500M /var/log
-
识别占用大量空间的目录或文件
示例:
du -ah /var | sort -hr | head -n 20
说明:
-a
:显示所有文件和目录。sort -hr
:按人类可读的格式逆序排序。head -n 20
:显示前20个结果。
示例输出:
2.0G /var/log 1.5G /var/log/nginx 1.2G /var/log/mysql 500M /var/www/html ...
使用 iotop
监控磁盘 I/O
iotop
是一个实时监控磁盘 I/O 使用情况的工具,类似于 top
,但专注于磁盘操作。
-
安装与基本用法
安装
iotop
sudo apt install iotop # Debian/Ubuntu sudo yum install iotop # CentOS/RHEL sudo dnf install iotop # Fedora
启动
iotop
sudo iotop
-
识别高 I/O 进程
在
iotop
界面中,查看正在进行大量读写操作的进程,帮助识别性能瓶颈。示例:
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1234 be/4 alice 0.00 B/s 0.00 B/s 0.00 % 0.00 % myapp 5678 be/4 bob 0.00 B/s 1.00 MB/s 0.00 % 0.00 % nginx
在此示例中,
nginx
进程正在进行大量磁盘写入操作。
11.1.4 网络带宽监控
网络带宽监控有助于了解网络流量的使用情况,识别异常流量和潜在的网络问题。
使用 iftop
监控实时网络流量
iftop
是一个实时流量监控工具,显示网络接口上的流量和连接情况。
-
安装与基本用法
安装
iftop
sudo apt install iftop # Debian/Ubuntu sudo yum install iftop # CentOS/RHEL sudo dnf install iftop # Fedora
启动
iftop
sudo iftop -i eth0
说明:
-i eth0
:指定要监控的网络接口(如eth0
、wlan0
)。
-
识别高流量连接
在
iftop
界面中,查看哪些 IP 地址或端口正在消耗大量带宽,帮助识别潜在的网络问题或攻击。示例:
Total send rate: 1.00 Gbits/sec Total receive rate: 500 Mbits/sec 192.168.1.100:443 500 Mbits/sec 200 Mbits/sec example.com 10.0.0.5:22 300 Mbits/sec 100 Mbits/sec remote.server.com
使用 nload
查看网络流量统计
nload
是一个简单的网络流量监控工具,显示网络接口的上传和下载流量统计。
-
安装与基本用法
安装
nload
sudo apt install nload # Debian/Ubuntu sudo yum install nload # CentOS/RHEL sudo dnf install nload # Fedora
启动
nload
nload eth0
说明:
eth0
:指定要监控的网络接口。
-
分析上传与下载流量
nload
提供了实时的上传(TX)和下载(RX)流量图表,帮助用户直观地了解网络流量的动态变化。示例:
eth0 [####################--------------------] 1.00 KB/s | 500.00 KB/s
字段说明:
- 上传流量(TX):发送到网络的流量。
- 下载流量(RX):从网络接收的流量。
11.2 系统性能优化
性能优化旨在通过调整系统配置和优化资源使用,提升系统整体性能和响应速度。
11.2.1 优化 CPU 使用
高 CPU 使用率可能导致系统响应缓慢,甚至无法处理新任务。通过调整进程优先级和优化高 CPU 使用进程,可以改善系统性能。
调整进程优先级,使用 nice
和 renice
-
nice
命令基本用法nice
用于启动一个新进程时设置其优先级。优先级值(niceness)范围从-20
(最高优先级)到19
(最低优先级),默认值为0
。示例:
启动一个进程,并设置优先级为
10
:nice -n 10 myapp
-
renice
命令基本用法renice
用于修改正在运行的进程的优先级。示例:
将 PID 为
1234
的进程优先级调整为5
:renice -n 5 1234
说明:
- 需要具有足够的权限(通常是超级用户)才能降低进程的优先级(设置为更高的 niceness 值)。
识别并优化高 CPU 使用进程
-
使用
top
和htop
查找高 CPU 使用进程在
top
或htop
中,按%CPU
列排序,找到消耗大量 CPU 资源的进程。示例(使用
htop
):-
启动
htop
:htop
-
按
%CPU
排序:按
F6
键,选择%CPU
进行排序。 -
识别高 CPU 使用进程:
查看顶部的进程列表,找出 CPU 使用率异常高的进程。
-
-
调整进程优先级或优化应用配置
对于高 CPU 使用的进程,可以通过以下方式进行优化:
-
调整优先级:
sudo renice -n 10 -p 1234
说明: 将 PID 为
1234
的进程优先级设置为10
,降低其 CPU 使用优先级。 -
优化应用配置:
检查应用程序的配置文件,调整线程数、缓存大小等参数,降低其 CPU 负载。
示例:
对于
nginx
,可以调整worker_processes
参数:worker_processes auto;
修改配置后,重新加载
nginx
:sudo systemctl reload nginx
-
11.2.2 内存优化
内存优化通过调整系统参数和管理缓存与交换空间,提升内存使用效率,防止内存不足导致的性能问题。
调整内核参数,使用 sysctl
sysctl
是一个用于查看和修改内核参数的工具,内核参数通常保存在 /etc/sysctl.conf
或 /etc/sysctl.d/
目录下的文件中。
-
常用内核参数
-
vm.swappiness
:控制系统使用交换空间的倾向。范围从
0
(尽量少使用交换空间)到100
(尽量多使用交换空间)。默认值:
60
优化建议: 将
vm.swappiness
设置为10
,减少交换空间的使用,提高系统性能。临时调整:
sudo sysctl vm.swappiness=10
永久调整:
编辑
/etc/sysctl.conf
文件,添加以下行:vm.swappiness=10
应用更改:
sudo sysctl -p
-
vm.vfs_cache_pressure
:控制系统回收目录和 inode 缓存的倾向。默认值为
100
,增大该值会加快缓存回收速度,减小则会保留更多缓存。优化建议: 将
vm.vfs_cache_pressure
设置为50
,保持更多的文件系统缓存,提升文件访问性能。临时调整:
sudo sysctl vm.vfs_cache_pressure=50
永久调整:
编辑
/etc/sysctl.conf
文件,添加以下行:vm.vfs_cache_pressure=50
-