当前位置: 首页 > news >正文

《Linux基础知识-4》

Linux基础知识-4

10. Linux 安全管理

Linux 安全管理涵盖了用户认证与授权、系统安全基础、防火墙配置、安全强化、日志审计与入侵检测以及SSH配置与加固等多个方面。通过合理配置和管理这些安全组件,系统管理员可以有效地保护系统免受未授权访问和潜在的网络攻击,确保系统的稳定性与安全性。以下内容将详细介绍各个子章节,帮助您全面掌握Linux安全管理的核心知识和实用技能。

10.1 用户认证与授权

用户认证与授权是确保只有经过授权的用户才能访问系统资源的关键机制。合理配置用户权限和访问控制策略,可以有效防止未经授权的访问和潜在的安全威胁。

10.1.1 配置 sudo 权限

sudo(Super User Do)允许授权用户以超级用户或其他用户的身份执行命令,提升了系统管理的灵活性和安全性。

添加用户到 sudo

在多数Linux发行版中,sudo 权限通过将用户添加到特定的组(如 sudowheel)来管理。

步骤:

  1. 添加用户到 sudo

    sudo usermod -aG sudo username
    

    说明:

    • -aG:将用户追加到指定组,而不从其他组中移除。
    • sudo:目标组名称。
    • username:要添加到组的用户名。
  2. 验证用户是否已添加到 sudo

    groups username
    

    示例输出:

    username : username sudo
    
编辑 /etc/sudoers 文件(使用 visudo

直接编辑 /etc/sudoers 文件可以细化和定制 sudo 权限配置。为了避免语法错误,建议使用 visudo 工具进行编辑。

步骤:

  1. 打开 sudoers 文件

    sudo visudo
    
  2. 配置全局 sudo 权限

    在文件中添加以下行,允许 sudo 组的所有成员拥有 sudo 权限:

    %sudo   ALL=(ALL:ALL) ALL
    
  3. 配置特定用户或组的 sudo 权限

    为特定用户赋予 sudo 权限:

    username ALL=(ALL) ALL
    

    为特定组赋予 sudo 权限:

    %admin ALL=(ALL) ALL
    
  4. 配置 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 内核的一个用户空间工具,用于配置和管理网络包过滤规则。虽然现代发行版逐渐转向更高级的工具(如 firewalldufw),但了解 iptables 的基础知识仍然十分重要。

基本概念与链(INPUT, OUTPUT, FORWARD)
  • 表(Table)iptables 使用不同的表来处理不同类型的规则,如 filter(默认)、natmangle

  • 链(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 策略

  1. 创建策略文件

    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;
    
  2. 编译并安装策略

    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 配置和管理安全日志

安全日志记录了系统的关键事件和活动,是审计和安全监控的基础。合理配置日志记录级别和权限,确保日志的完整性和可用性。

设置日志记录级别

日志记录级别决定了系统记录哪些类型的事件和信息。不同的日志记录级别适用于不同的安全需求。

步骤:

  1. 编辑 rsyslog 配置文件

    sudo nano /etc/rsyslog.conf
    
  2. 配置不同级别的日志记录

    示例:

    # 记录所有紧急级别及以上的日志到 /var/log/critical.log
    *.emerg    /var/log/critical.log# 记录警告级别及以上的日志到 /var/log/warnings.log
    *.warn     /var/log/warnings.log# 记录所有信息级别及以上的日志到 /var/log/syslog
    *.*        /var/log/syslog
    
  3. 重启 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:所有者具有读写权限,组用户具有读取权限,其他用户无权限。

使用 chownchmod 修改权限

# 修改文件所属组
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)。

步骤:

  1. 复制默认配置文件

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    
  2. 编辑 jail.local 文件

    sudo nano /etc/fail2ban/jail.local
    
  3. 配置监控服务(如 sshd

    示例:配置 sshd 监狱

    [sshd]
    enabled = true
    port    = ssh
    filter  = sshd
    logpath = /var/log/auth.log
    maxretry = 5
    bantime = 600
    
  4. 配置防护参数

    • maxretry:允许的最大失败尝试次数。
    • bantime:封禁时间(秒)。

    示例:

    [sshd]
    enabled = true
    port    = ssh
    filter  = sshd
    logpath = /var/log/auth.log
    maxretry = 5
    bantime = 600
    
  5. 重启 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

步骤:

  1. 创建 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 =
    
  2. 编辑 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
    
  3. 重启 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 不可用,可以手动复制公钥:

  1. 复制公钥内容

    cat ~/.ssh/id_rsa.pub
    
  2. 在服务器上创建 ~/.ssh 目录并设置权限

    ssh username@remote_host
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  3. 将公钥添加到 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

步骤:

  1. 打开配置文件

    sudo nano /etc/ssh/sshd_config
    
  2. 禁用密码认证

    找到并修改以下行:

    PasswordAuthentication no
    
  3. 禁用 Root 用户登录

    找到并修改以下行:

    PermitRootLogin no
    
  4. 禁用不必要的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

其他安全选项:

  • 更改默认端口

    步骤:

    1. 编辑配置文件

      sudo nano /etc/ssh/sshd_config
      
    2. 更改端口号

      Port 2222
      
    3. 更新防火墙规则

      使用 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
      
    4. 重启 SSH 服务

      sudo systemctl restart sshd
      
  • 启用 TCP Wrappers

    步骤:

    1. 编辑 /etc/hosts.allow 文件

      sudo nano /etc/hosts.allow
      

      添加规则:

      sshd: 192.168.1.0/24
      
    2. 编辑 /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 使用率可能导致系统响应缓慢甚至崩溃。

使用 tophtop

tophtop 是最常用的实时系统监控工具,用于查看系统的 CPU、内存、进程等使用情况。

  • 实时监控 CPU 使用情况

    top 命令

    top 是一个命令行工具,默认安装在大多数 Linux 发行版中。

    top
    

    htop 命令

    htoptop 的增强版,提供了更友好的用户界面和更多的功能。

    sudo apt install htop    # Debian/Ubuntu
    sudo yum install htop    # CentOS/RHEL
    sudo dnf install htop    # Fedora
    
    htop
    

    比较 tophtop

    • top:简洁、基本功能,适合快速查看系统状态。
    • htop:彩色界面、支持鼠标操作、可视化显示,更适合深入分析。
  • 识别高 CPU 使用进程

    tophtop 中,按 %CPU 列排序,可以快速找到消耗 CPU 资源最多的进程。

    示例(使用 top):

    1. 启动 top

      top
      
    2. %CPU 列排序:

      top 界面中,按 P 键可以按 CPU 使用率排序。

    3. 识别高 CPU 使用进程:

      查看顶部列出的进程,找出消耗大量 CPU 的应用程序或服务。

    示例(使用 htop):

    1. 启动 htop

      htop
      
    2. %CPU 排序:

      F6 键,选择 %CPU 作为排序依据。

    3. 识别高 CPU 使用进程:

      查看顶部的进程列表,找出高负载进程。

使用 mpstat 查看多核 CPU 性能

mpstatsysstat 包中的一个工具,用于报告各个 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 输出

    • siso 表示交换活动频繁,可能是内存不足。
    • 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
    
  • 识别内存泄漏进程

    1. 排序进程按内存使用量

      top 界面中,按 M 键可以按内存使用量排序。

    2. 监控高内存使用进程

      观察持续占用大量内存的进程,确认是否存在内存泄漏。

    示例:

    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:指定要监控的网络接口(如 eth0wlan0)。
  • 识别高流量连接

    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 使用进程,可以改善系统性能。

调整进程优先级,使用 nicerenice
  • nice 命令基本用法

    nice 用于启动一个新进程时设置其优先级。优先级值(niceness)范围从 -20(最高优先级)到 19(最低优先级),默认值为 0

    示例:

    启动一个进程,并设置优先级为 10

    nice -n 10 myapp
    
  • renice 命令基本用法

    renice 用于修改正在运行的进程的优先级。

    示例:

    将 PID 为 1234 的进程优先级调整为 5

    renice -n 5 1234
    

    说明:

    • 需要具有足够的权限(通常是超级用户)才能降低进程的优先级(设置为更高的 niceness 值)。
识别并优化高 CPU 使用进程
  • 使用 tophtop 查找高 CPU 使用进程

    tophtop 中,按 %CPU 列排序,找到消耗大量 CPU 资源的进程。

    示例(使用 htop):

    1. 启动 htop

      htop
      
    2. %CPU 排序:

      F6 键,选择 %CPU 进行排序。

    3. 识别高 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
      
http://www.dtcms.com/a/329203.html

相关文章:

  • Kubernetes-03:Service
  • LeetCode——456. 132 模式
  • 6 .循环-for
  • 高级项目——基于FPGA的串行FIR滤波器
  • Rust面试题及详细答案120道(01-10)-- 基础语法与数据类型
  • 日志数据链路的 “搬运工”:Flume 分布式采集的组件分工与原理
  • React常见的Hooks
  • 低成本扩展方案:S7-200SMART作为S7-1500分布式IO从站的上位机配置指南
  • 第三天-在DBC中创建一个Signal Group信号组
  • MySQL新增字段与Java实体不同步:常见问题排查与高效解决方案
  • 流处理 or 批处理?大数据架构还需要流批一体吗?
  • wangeditor v4修改缩进并清除粘贴文档带入的格式
  • MySQL极简安装挑战:从依赖管理到高效部署
  • MySQL数据线上扩容方案
  • npm安装时一直卡住的解决方法
  • Grayscale® 推出 Walrus 和 DeepBook 信托产品
  • 图像分类-动手学计算机视觉10
  • 解决:[64000][257] ORA-00257: 归档程序错误。只有在解析完成后才以 AS SYSDBA 方式连接问题
  • 面试实战 问题二十七 java 使用1.8新特性,判断空
  • 深入理解 uni-app 的 uni.createSelectorQuery()
  • SAP Valuation Category在制造业成本核算中的使用场景与配置方案
  • Easysearch 数据迁移之 INFINI Gateway
  • 云计算-OpenStack 运维开发实战:从 Restful API 到 Python SDK 全场景实现镜像上传、用户创建、云主机部署全流程
  • OpenBMC 中命令模式的深度解析:从原理到实现
  • Flink中的窗口
  • HTML5 Canvas实现数组时钟代码,适用于wordpress侧边栏显示
  • 用 mock 把 ES 单元测试@elastic/elasticsearch-mock 上手
  • PyTorch基础(使用TensorFlow架构)
  • Nginx的SSL通配符证书自动续期
  • Python(二):MacBook安装 Python并运行第一个 Python 程序