前言
在信息技术高速发展的当下,网络环境的复杂性和危险性与日俱增,Linux 系统作为服务器端的主流操作系统,其安全防护成为保障业务稳定运行、数据完整可靠的核心环节。系统安全的漏洞往往会被恶意攻击者利用,造成数据泄露、服务瘫痪甚至整个系统被控制的严重后果。
本文将围绕 Linux 系统安全及应用展开全面讲解,从账号安全控制、系统引导和登录控制两大基础防护维度入手,再到弱口令检测、端口扫描等风险排查技术,结合实操命令和配置案例,详细介绍各类安全措施的实现方法,帮助运维人员和开发人员构建起一套完整的 Linux 系统安全防护体系,有效降低安全风险,为网络环境的安全可靠保驾护航。
一、账号安全控制
用户账号是访问 Linux 系统资源的唯一身份凭证,账号的安全直接决定了系统的第一道防线是否牢固。Linux 系统提供了丰富的账号安全控制机制,涵盖系统账号清理、密码安全管控、命令历史及自动注销、用户切换与提权等多个方面,通过精细化的配置,可确保用户账号的正当、安全使用。
1.1 基本安全措施
1.1.1 系统账号清理
Linux 系统中除了管理员手动创建的用户账号外,还存在大量随系统或程序安装生成的非登录用户账号 ,如 bin、daemon、adm、lp、mail 等,这类账号的作用是维护系统运作、启动或保持服务进程,默认不允许终端登录,其登录 Shell 配置为/sbin/nologin,管理员需确保该配置不被人为改动,可通过以下命令验证:
[root@localhost ~]# grep "/sbin/nologin$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
对于系统中很少用到的冗余非登录账号(如 games),可直接删除;若应用程序卸载后未自动清理其创建的账号,管理员需手动清理。
对于服务器中长期不用但暂无法确定是否删除的用户账号,可采用锁定账号 的方式,避免被非法利用。passwd和usermod命令均可实现账号的锁定与解锁,以账号 zhangsan 为例:
# 锁定账号
[root@localhost ~]# usermod -L zhangsan
# 查看账号状态
[root@localhost ~]# passwd -S zhangsan
zhangsan LK 2017-08-24 0 99999 7 -1 (密码已被锁定。)
# 解锁账号
[root@localhost ~]# usermod -U zhangsan
# 再次查看账号状态
[root@localhost ~]# passwd -S zhangsan
zhangsan PS 2017-08-24 0 99999 7 -1 (密码已设置,使用SHA512算法。)
若服务器的用户账号已固定,无需再进行添加、删除或属性修改,可通过chattr命令锁定账号配置文件 /etc/passwd和/etc/shadow,文件被锁定后其内容将无法变更,有效防止账号被恶意篡改。lsattr命令可查看文件的锁定状态,具体操作:
# 锁定账号配置文件
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow
# 查看文件锁定状态
[root@localhost ~]# lsattr /etc/passwd /etc/shadow
----i----------- /etc/passwd
----i----------- /etc/shadow
# 解锁账号配置文件
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow
# 验证解锁结果
[root@localhost ~]# lsattr /etc/passwd /etc/shadow
---------------- /etc/passwd
---------------- /etc/shadow
文件锁定后,尝试添加新账号会直接失败,提示无法打开配置文件:
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow
[root@localhost ~]# useradd billgate
useradd:无法打开/etc/passwd
1.1.2 密码安全控制
弱密码、长期未更换的密码是系统被暴力破解的主要诱因,管理员需在服务器端对用户密码进行强制管控,降低密码泄露和被破解的风险,主要包括设置密码有效期 和强制用户首次 / 下次登录修改密码两种方式。
-
设置密码最大有效天数 可通过修改
/etc/login.defs文件配置新建用户的密码有效期,该文件为系统账号配置的全局默认文件,修改后仅对后续创建的用户生效。例如,将密码最大有效天数设为 30 天:[root@localhost ~]# vi /etc/login.defs # 找到以下配置项,修改值为30 PASS_MAX_DAYS 30对于已存在的用户 ,需使用
chage命令单独设置密码有效期,例如为用户 lisi 设置密码有效期 30 天:[root@localhost ~]# chage -M 30 lisi密码过期后,用户登录系统时将被强制要求重新设置密码,否则拒绝登录。
-
强制用户下次登录修改密码 在批量创建用户、安全规划更新密码等场景下,可通过
chage -d 0命令强制用户下次登录时必须自设密码,例如强制用户 zhangsan 下次登录重设密码:[root@localhost ~]# chage -d 0 zhangsan当 zhangsan 用户登录时,会触发密码修改流程:
Localhost login: zhangsan password: You are required to change your password immediately (root enforced) Changing password for zhangsan. (current) UNIX password: New password: Retype new password:
1.1.3 命令历史、自动注销
Bash 终端的命令历史机制虽为用户操作提供了便利,但也存在安全隐患 ------ 若攻击者获取用户的命令历史文件,可还原用户的操作过程,若用户曾在命令行输入明文密码,将直接导致系统安全泄露。同时,管理员离开时未关闭终端,可能被他人误操作或恶意利用,因此需对命令历史记录和终端闲置状态进行管控。
-
限制命令历史记录条数 Bash 终端的历史命令记录条数由环境变量
HISTSIZE控制,默认记录 1000 条。可通过修改/etc/profile文件修改所有新登录用户的命令历史记录上限,例如设置为 200 条:[root@localhost ~]# vi /etc/profile # 找到或添加以下配置项 HISTSIZE=200若需仅对当前用户 生效,可直接通过
export命令设置:[root@localhost ~]# export HISTSIZE=200 -
退出终端自动清空命令历史 修改用户宿主目录下的
~/.bash_logout文件,添加history -c(清空历史命令)和clear(清屏)命令,当用户退出 Bash 终端时,将自动清空本次登录的命令历史,避免被他人查看:[root@localhost ~]# vi ~/.bash_logout # 添加以下两行内容 history -c clear -
终端闲置自动注销 利用环境变量
TMOUT设置终端闲置超时时间(单位:秒),当终端超过指定时间无任何输入时,将自动注销,有效防止管理员离开后的未授权操作。对所有新登录用户生效的配置方式:
[root@localhost ~]# vi /etc/profile # 找到或添加以下配置项,设置超时时间600秒(10分钟) export TMOUT=600对当前用户生效的配置方式:
[root@localhost ~]# export TMOUT=600注意:执行程序编译、系统配置修改等耗时较长的操作时,应避免设置 TMOUT,必要时可通过
unset TMOUT命令取消该变量设置。
1.2 用户切换与提权
Linux 系统中 root 用户拥有最高权限,直接以 root 用户登录服务器存在极大风险 ------ 一旦密码泄露,攻击者将完全控制系统;同时,管理员的误操作也可能导致系统崩溃。因此,生产环境中建议管理员以普通用户登录,必要时通过用户切换 或权限提升 机制执行管理任务。Linux 系统提供了su和sudo两个核心命令实现该需求,其中su用于切换用户,sudo用于精细化提升执行权限。
1.2.1 su 命令:切换用户身份
su命令可实现不同用户之间的身份切换,切换时需验证目标用户的密码(从 root 用户切换到普通用户时无需验证)。其基本语法为:
su [选项] 目标用户名
核心选项-(等同于--login或-l)表示切换用户后进入目标用户的登录 Shell 环境 ,包括加载目标用户的环境变量、宿主目录等;若缺少该选项,仅切换身份,不切换用户环境。切换为 root 用户时,root可省略。
示例:普通用户 jerry 切换为 root 用户:
[jerry@localhost ~]$ su - root
密码: # 输入root用户的密码
1.2.2 限制 su 命令的使用(PAM 认证)
默认情况下,Euler 等部分 Linux 系统会启用PAM 可插拔认证模块 的pam_wheel认证组件,限制普通用户使用su命令 ------ 未加入wheel组的用户,尝试使用su切换用户时会提示权限拒绝,这一机制可有效防止普通用户反复尝试破解 root 密码。
PAM 是 Linux 系统的中央认证机制,适用于 login、su、telnet 等各类应用程序,其认证流程为:服务 (Service)→PAM 配置文件 (位于 /etc/pam.d/)→PAM 认证模块 (位于 /lib/security/) 。每个应用程序对应一个 PAM 配置文件,例如 su 命令的配置文件为/etc/pam.d/su。
启用并配置 pam_wheel 认证的步骤:
-
将授权使用 su 命令的用户添加到
wheel组,例如授权用户 tsengyia:[root@localhost ~]# gpasswd -a tsengyia wheel 正在将用户"tsengyia"加入到"wheel"组中 -
验证 wheel 组的成员:
[root@localhost ~]# grep wheel /etc/group wheel:x:10:tsengyia -
编辑
/etc/pam.d/su配置文件,启用pam_wheel.so模块:[root@localhost ~]# vi /etc/pam.d/su # 确保存在以下行(若未注释则已启用) auth required pam_wheel.so use_uid
启用后,未加入 wheel 组的用户(如 jerry)尝试使用 su 命令将直接失败:
[jerry@localhost ~]$ su - root
密码:
su: 拒绝权限
su 命令的所有操作都会记录到系统安全日志/var/log/secure中,管理员可通过该日志查看 su 命令的使用情况,排查异常操作。
1.2.3 sudo 命令:精细化提升执行权限
su命令切换用户的前提是知道目标用户的密码,若多个管理员需要执行管理操作,将导致 root 密码被多人知晓,增加泄露风险。sudo命令则完美解决了这一问题 ------ 它允许普通用户在无需知晓 root 密码的情况下,以超级用户或其他用户的身份执行指定的特权命令,且管理员可通过精细化配置,为不同用户分配不同的操作权限,实现权限的最小化授予。
1.3 sudo 命令的配置与使用
1.3.1 配置文件 /etc/sudoers
sudo 的核心配置文件为/etc/sudoers,该文件默认权限为 440,禁止直接使用 vi 编辑 (保存时会提示只读,需强制操作),Linux 系统提供了专门的编辑工具visudo,该工具会在保存时自动检查配置语法,避免因语法错误导致 sudo 命令无法使用。
/etc/sudoers中授权记录的基本配置格式:
user MACHINE=COMMANDS
各字段含义:
- user :被授权的对象,可为单个用户名,或采用
%组名的形式授权整个用户组(% 为组标识); - MACHINE :允许使用该配置的主机名,主要用于多主机共用 sudoers 文件的场景,单机环境一般设为localhost或实际主机名;
- COMMANDS :允许被授权用户通过 sudo 执行的特权命令,必须填写命令的完整绝对路径 ,多个命令之间以逗号
,分隔。
基础授权示例:
-
授权用户 jerry 在localhost上执行
ifconfig命令(修改 IP 地址):[root@localhost ~]# visudo # 添加以下行 jerry localhost=/sbin/ifconfig -
授权 wheel 组的所有用户在任意主机上无需验证密码 执行所有命令:
[root@localhost ~]# visudo # 添加以下行 %wheel ALL=NOPASSWD: ALL其中
NOPASSWD:表示执行 sudo 时无需输入自身密码,ALL为通配符,分别表示任意主机、任意命令。
1.3.2 别名配置:简化批量授权
当被授权的用户、主机或命令数量较多时,可通过别名 集中定义,简化 sudoers 配置。别名必须为大写字母 ,分别通过User_Alias(用户别名)、Host_Alias(主机别名)、Cmnd_Alias(命令别名)关键字定义,多个成员之间以逗号,分隔。
别名授权示例:允许用户 jerry、tom、tsengyia 在主机 smtp、pop 上执行 rpm、yum 命令:
[root@localhost ~]# visudo
# 定义用户别名
User_Alias OPERATORS=jerry,tom,tsengyia
# 定义主机别名
Host_Alias MAILSVRS=smtp,pop
# 定义命令别名
Cmnd_Alias PKGTOOLS=/bin/rpm,/usr/bin/yum
# 授权别名组合
OPERATORS MAILSVRS=PKGTOOLS
1.3.3 通配符与取反:精细化权限控制
sudoers 的命令字段支持通配符*和 取反符号!,可实现 "允许执行某个目录下的所有命令,排除个别命令" 的精细化管控。
示例 :授权用户 syrianer 在localhost上执行/sbin/目录下除ifconfig和route外的所有命令:
[root@localhost ~]# visudo
# 添加以下行
syrianer localhost=/sbin/*,!/sbin/ifconfig,!/sbin/route
1.3.4 启用 sudo 日志记录
默认情况下,sudo 的操作不会被单独记录,管理员可在 sudoers 中添加Defaults logfile配置,启用 sudo 日志,记录所有用户的 sudo 操作,便于后续审计和问题排查。
示例 :将 sudo 日志记录到/var/log/sudo文件:
[root@localhost ~]# visudo
# 找到Defaults配置段,添加以下行
Defaults logfile = "/var/log/sudo"
1.3.5 执行 sudo 特权命令
已获得授权的普通用户,执行特权命令时需在命令前添加sudo,并输入自身的密码(而非 root 密码)进行验证。第一次验证后,5 分钟内再次执行 sudo 命令无需重复验证。
示例:用户 jerry 使用 sudo 执行 ifconfig 命令修改 IP 地址:
# 未使用sudo,提示操作不允许
[jerry@localhost ~]$ /sbin/ifconfig ens33:0 192.168.1.11/24
SIOCSIFADDR: 不允许的操作
SIOCSIFFLAGS: 不允许的操作
SIOCSIFNETMASK: 不允许的操作
# 使用sudo执行,验证自身密码后成功
[jerry@localhost ~]$ sudo /sbin/ifconfig ens33:0 192.168.1.11/24
[sudo] password for jerry: # 输入jerry的密码
# 查看执行结果
[jerry@localhost ~]$ /sbin/ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:0c:29:3b:ff:76 txqueuelen 1000 (Ethernet)
用户可通过sudo -l命令查看自身获得的 sudo 授权,未授权用户将提示 "may not run sudo":
[syrianer@localhost ~]$ sudo -l
[sudo] password for syrianer:
用户syrianer 可以在该主机上运行以下命令:
(root) /sbin/*, (root) !/sbin/ifconfig, (root) !/sbin/route
管理员可通过 sudo 日志查看所有 sudo 操作记录:
[root@localhost ~]# tail /var/log/sudo
Aug 24 23:59:44 : jerry : TTY=pts/0 ; PWD=/home/jerry ; USER=root ; COMMAND=/sbin/ifconfig ens33:0 192.168.1.11/24
二、系统引导和登录控制
Linux 服务器的远程管理是主流方式,但本地引导和终端登录的安全往往被忽视,若服务器所在机房的物理管控不严格,未授权人员可通过本地操作篡改系统配置、窃取数据甚至破坏系统。因此,需从开关机安全控制 和终端及登录控制两方面入手,加强系统物理和引导层面的安全防护。
2.1 开关机安全控制
开关机安全控制的核心是防止未授权人员通过本地设备引导系统 和篡改 GRUB 引导参数,需结合 BIOS 配置和 GRUB 密码设置实现双重防护,同时做好服务器的物理防护(如机箱上锁、机柜封闭、限制机房人员进出)。
2.1.1 调整 BIOS 引导设置
BIOS 是系统启动的第一道程序,通过修改 BIOS 引导配置,可禁止从外接设备引导系统,防止攻击者通过 U 盘、光盘等介质启动恶意系统,具体配置步骤:
- 将第一优先引导设备(First Boot Device) 设置为系统所在的本地磁盘;
- 将光盘、U 盘、网络等其他引导设备的选项设为Disabled,禁止从这些设备引导;
- 将 BIOS 的安全级别改为setup,并设置 BIOS 管理密码,防止未授权人员修改 BIOS 配置。
2.1.2 限制更改 GRUB 引导参数
GRUB 是 Linux 系统的主流引导程序,通过修改 GRUB 引导参数,可实现单用户模式登录、跳过密码验证等操作,若攻击者能够修改 GRUB 参数,将直接获取系统控制权。因此,需为 GRUB 菜单设置密码,只有提供正确密码,才能编辑引导参数。
Linux 系统中推荐使用grub2-mkpasswd-pbkdf2命令生成 GRUB 密码,该命令会生成经过PBKDF2 算法加密 的密码字符串,相比明文密码安全性更高。具体配置步骤(以 GRUB2 为例):
-
生成加密的 GRUB 密码,根据提示输入并确认密码,命令会输出加密后的字符串:
[root@localhost ~]# grub2-mkpasswd-pbkdf2 输入密码: 重新输入口令: 您的密码的 PBKDF2哈希为grub.pbkdf2.sha512.10000.008E820A9C9582F74076E747CF75F1E642C21CFA6B555DD2DF61D0A90DF98DAAFA8E83F3FC188BDE774C4B28ED158D2C274E9E4B24E91AFAE763F0FF6CE467AF.19BE9E44CB15605F64B80BFE6BA04428ABB29FF9CD1AA2D051DA20752600B898F8C49653DA24F58E39CBA1E5D798994BBB9A25B0B6EF12FFC9B26F17864C5871 -
备份 GRUB 相关配置文件,防止配置错误导致系统无法引导:
[root@localhost ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak [root@localhost ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak -
编辑 GRUB 用户配置文件
/etc/grub.d/01_users,添加超级用户和加密密码配置(将步骤 1 生成的加密字符串粘贴到对应位置):[root@localhost ~]# vim /etc/grub.d/01_users # 添加以下内容 #!/bin/sh -e cat <<EOF set superusers="root" export superusers password_pbkdf2 root 【此处粘贴步骤1生成的加密密码字符串】 EOF -
重新生成 GRUB 配置文件
grub.cfg,使配置生效:[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img done
配置完成后,系统重启进入 GRUB 菜单时,按 E 键尝试编辑引导参数会提示输入 GRUB 用户名和密码,只有验证通过才能进行编辑,有效防止引导参数被篡改。
注意:不建议在 GRUB 配置中使用明文密码,虽然配置更简单,但安全性极低,易被攻击者获取。
2.2 终端及登录控制
在服务器进行备份、调试、系统升级等维护工作时,为避免新的用户登录导致资源占用、操作冲突或配置篡改,可临时限制普通用户的登录,仅允许 root 用户登录系统,实现方式为创建 **/etc/nologin** 文件。
login程序在用户登录时会检查/etc/nologin文件是否存在,若存在则拒绝普通用户登录,root 用户不受此限制。创建该文件的命令:
[root@localhost ~]# touch /etc/nologin
该方法为临时限制手段,适用于服务器维护期间,当维护工作完成后,删除 /etc/nologin 文件或重启服务器,即可恢复普通用户的正常登录:
[root@localhost ~]# rm -rf /etc/nologin
三、弱口令检测与端口扫描
即使做好了账号和引导的安全控制,系统仍可能存在弱口令账号 和开放的危险端口等隐性安全风险,攻击者可通过弱口令暴力破解账号,或利用开放的端口和服务进行漏洞攻击。因此,需定期对系统进行弱口令检测和端口扫描,及时发现并修复安全隐患。本文将介绍两款主流的安全工具:John the Ripper(弱口令检测)和 NMAP(端口扫描)。
3.1 弱口令检测:John the Ripper
John the Ripper 是一款开源的密码破解工具,支持 DES、MD5、SHA512 等多种加密算法,能够在已知密文的情况下快速分析出明文密码,既可以通过内置规则进行暴力破解,也可以结合密码字典实现精准破解,是 Linux 系统中检测账号密码强度的必备工具。
3.1.1 下载并安装 John the Ripper
John the Ripper 的官方网站为http://www.openwall.com/john/,可从官网下载最新的源码包(如 john-1.8.0.tar.gz),Linux 系统中需通过源码编译安装,具体步骤:
-
解压源码包:
[root@localhost ~]# tar zxf john-1.8.0.tar.gz [root@localhost ~]# cd john-1.8.0解压后包含 doc(手册文档)、run(运行程序)、src(源码文件)三个子目录和 README 说明文件。
-
安装编译依赖(gcc 编译器):
[root@localhost john-1.8.0]# dnf -y install gcc -
切换到 src 目录,执行编译命令(以 x86_64 架构的 Linux 系统为例):
[root@localhost john-1.8.0]# cd src/ [root@localhost src]# make clean linux-x86-64若单独执行
make命令,可查看支持的编译系统类型。 -
验证编译结果:编译完成后,run 目录下会生成可执行程序
john,无需单独执行安装命令,直接运行该程序即可:[root@localhost src]# ls ../run/ ascii.chr john.conf makechr unafs digits.chr lm_ascii.chr password.lst unique john mailer relbench unshadow
3.1.2 检测系统弱口令账号
John the Ripper 通过解析 Linux 系统的密码密文文件/etc/shadow实现弱口令检测,该文件存储了用户的密码加密密文,因此需先将该文件复制到指定目录,再通过 john 程序进行破解分析。具体操作步骤:
-
准备待检测的 shadow 文件(复制并修改权限,确保 john 程序可读取):
[root@localhost src]# cp /etc/shadow /root/shadow.txt [root@localhost src]# chmod 644 /root/shadow.txt -
切换到 run 目录,执行 john 程序,将 shadow.txt 作为参数,开始弱口令破解:
[root@localhost src]# cd ../run [root@localhost run]# ./john /root/shadow.txt Loaded 6 password hashes with 6 different salts (crypt, generic crypt(3) [?/64]) Remaining 4 password hashes with 4 different salts Press 'q' or Ctrl-C to abort, almost any other key for status zhangsan (zhangsan) nwod-b (b-down) 123456 (kadmin) a1b2c3 (tsengyia) iloveyou (lisi)破解过程中,找到的弱口令会即时输出,格式为明文密码(用户名) ,若破解时间过长,可按
Ctrl+C强行终止。 -
查看已破解的弱口令账号列表:破解出的密码会自动保存到
john.pot文件中,通过--show选项可查看完整的破解结果:[root@localhost run]# ./john --show /root/shadow.txt kadmin:123456:15114:0:99999:7::: zhangsan:zhangsan:15154:0:99999:7::: tsengyia:a1b2c3:15154:0:99999:7::: b-down:nwod-b:15146:0:99999:7::: lisi:iloveyou:15154:0:99999:7::: 5 password hashes cracked, 3 left
3.1.3 使用密码字典文件进行精准破解
John the Ripper 的默认暴力破解规则针对常见弱口令,而密码字典(包含大量密码组合的列表文件)能大幅提高破解效率和成功率,字典文件越全面,破解出的弱口令越多。
John the Ripper 默认提供的字典文件为run/password.lst,包含 3000 多个常见弱口令,管理员也可自行收集或生成更全面的字典文件。执行 john 程序时,通过--wordlist=选项指定字典文件路径,实现字典破解:
-
清空原有破解记录(john.pot),便于重新分析:
[root@localhost run]# :> john.pot -
使用默认字典文件进行破解:
[root@localhost run]# ./john --wordlist=./password.lst /root/shadow.txt Loaded 6 password hashes with 6 different salts (crypt, generic crypt(3) [?/64]) Press 'q' or Ctrl-C to abort, almost any other key for status 123456 (jerry) 123456 (kadmin) a1b2c3 (tsengyia) iloveyou (lisi) 4g 0:00:00:28 100% 0.1412g/s 125.2p/s 270.8c/s 270.8C/s !@#$%..sss Use the "--show" option to display all of the cracked passwords reliably Session completed
从结果可看出,字典破解的效率远高于默认暴力破解,而像123456、iloveyou、用户名与密码相同等简单密码,几乎能被瞬间破解。因此,管理员在发现弱口令账号后,应立即强制用户修改为复杂密码(包含大小写字母、数字、特殊符号,长度不少于 8 位)。
3.2 端口扫描:NMAP
NMAP 是一款强大的开源端口扫描工具 ,官方网站为http://nmap.org/,支持 ping 扫描、多端口检测、操作系统识别、服务版本探测等多种功能,可快速检测目标主机开放的端口、提供的服务,以及网络中的存活主机。通过 NMAP 定期扫描内部网络和服务器,能及时发现未授权开放的端口和服务,关闭不安全的服务,减小系统被攻击的风险。
3.2.1 安装 NMAP
Linux 系统中可通过 YUM/DNF 包管理器快速安装 NMAP,操作简单且无需编译,以 CentOS/RHEL/Euler 为例:
[root@localhost ~]# yum install -y nmap
安装完成后,nmap 命令的可执行程序位于/usr/bin/nmap。
3.2.2 NMAP 基本语法与核心扫描类型
NMAP 的基本命令语法:
nmap [扫描类型] [选项] <扫描目标...>
- 扫描目标:可为主机名、IP 地址、网络段(如 192.168.4.0/24),多个目标以空格分隔;
- 常用选项 :
-p指定扫描的端口(单个端口、端口段、多个端口),-n禁用反向 DNS 解析(加快扫描速度); - 扫描类型:决定检测方式,直接影响扫描结果和效率,常用的扫描类型如下表所示:
表格
| 扫描类型 | 命令选项 | 扫描原理 | 特点 |
|---|---|---|---|
| TCP SYN 扫描(半开扫描) | -sS | 仅发送 SYN 数据包,收到 SYN/ACK 则认为端口开放,立即断开连接 | 扫描速度快、隐蔽性高,不易被防火墙记录 |
| TCP 连接扫描(全连接扫描) | -sT | 建立完整的 TCP 连接,连接成功则认为端口开放 | 扫描结果准确,但速度慢、隐蔽性差,易被检测 |
| TCP FIN 扫描 | -sF | 发送 FIN 数据包,开放端口忽略,关闭端口返回 RST 数据包 | 可检测防火墙对非 SYN 数据包的过滤能力 |
| UDP 扫描 | -sU | 发送 UDP 数据包,根据返回结果判断端口是否开放 | 扫描速度慢,用于探测 UDP 服务 |
| ICMP 扫描(ping 扫描) | -sP | 仅检测目标主机是否存活,不扫描端口 | 快速检测网络中的存活主机 |
| 跳过 ping 检测 | -P0 | 假设所有目标主机存活,直接扫描端口 | 适用于目标主机禁止 ping 的场景 |
3.2.3 NMAP 扫描实操案例
案例 1:扫描本机开放的 TCP 和 UDP 常用端口
检测本机(127.0.0.1)的 TCP 常用端口开放情况:
[root@localhost ~]# nmap 127.0.0.1
Starting Nmap 6.40 ( http://nmap.org ) at 2017-09-14 21:59 EDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000014s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
631/tcp open ipp
Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds
检测本机的 UDP 常用端口开放情况(加-sU选项):
[root@localhost ~]# nmap -sU 127.0.0.1
Starting Nmap 6.40 ( http://nmap.org ) at 2017-09-14 21:59 EDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000022s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
67/udp open|filtered dhcps
69/udp open|filtered tftp
5353/udp open|filtered zeroconf
Nmap done: 1 IP address (1 host up) scanned in 1.52 seconds
端口状态说明 :open表示端口开放,filtered表示端口可能被防火墙过滤,closed表示端口关闭。
案例 2:扫描指定网段的特定端口
检测 192.168.4.0/24 网段中开放 FTP 服务(21 端口)的主机(加-p指定端口):
[root@localhost ~]# nmap -p 21 192.168.4.0/24
Starting Nmap 6.40 ( http://nmap.org ) at 2017-09-14 22:01 EDT
Nmap scan report for 192.168.4.253
Host is up (0.00016s latency).
PORT STATE SERVICE
21/tcp open ftp
MAC Address: 00:50:56:C0:00:03 (VMware)
Nmap scan report for 192.168.4.254
Host is up (-480s latency).
PORT STATE SERVICE
21/tcp open ftp
Nmap done: 256 IP addresses (2 hosts up) scanned in 8.11 seconds
案例 3:快速检测网段中的存活主机
快速检测 192.168.4.0/24 网段中能 ping 通的存活主机(-sPping 扫描 +-n禁用 DNS 解析):
[root@localhost ~]# nmap -n -sP 192.168.4.0/24
Starting Nmap 6.40 ( http://nmap.org ) at 2017-09-14 22:01 EDT
Nmap scan report for 192.168.4.253
Host is up (0.00011s latency).
MAC Address: 00:50:56:C0:00:03 (VMware)
Nmap scan report for 192.168.4.254
Host is up.
Nmap done: 256 IP addresses (2 hosts up) scanned in 8.08 seconds
案例 4:扫描指定 IP 段的多个端口
检测 192.168.4.100~200 网段中开放文件共享服务(139、445 端口)的主机(多个端口以逗号分隔):
[root@localhost ~]# nmap -p 139,445 192.168.4.100-200
Starting Nmap 6.40 ( http://nmap.org ) at 2017-09-14 22:03 EDT
Nmap scan report for 192.168.4.110
Host is up (0.00028s latency).
PORT STATE SERVICE
139/tcp open netbios-ssn
445/tcp open microsoft-ds
MAC Address: 00:0C:29:99:01:07 (VMWare)
Nmap done: 101 IP addresses (1 host up) scanned in 12.163 seconds
四、系统压力测试补充:hping3
除了端口扫描,服务器还需承受网络流量的压力,hping3 是一款强大的网络压力测试工具,可模拟各种网络数据包,对目标主机进行 TCP/UDP 洪水攻击测试,验证服务器和防火墙的抗压能力。
常用 hping3 压力测试命令:
-
对 192.168.10.1 的 80 端口进行 TCP SYN 洪水测试,发送 3 个 120 字节的数据包:
hping3 -c 3 -d 120 -S -w 64 -p 80 --flood 192.168.10.1 -
模拟 1000 个不同客户端对 192.168.10.1 的 80 端口进行 TCP SYN 洪水测试:
hping3 -c 1000 -d 100 -S -w 64 -p 80 --flood --rand-source 192.168.10.1
参数说明:
-c:发送的数据包数量;-d:数据包的数据部分字节数;-S:设置 TCP SYN 标志(模拟连接请求);-w:TCP 窗口大小;-p:目标端口;--flood:洪水模式,快速发送数据包;--rand-source:使用随机源 IP,模拟不同客户端。
注意:hping3 仅用于内部服务器的压力测试,禁止对非授权的外部主机进行扫描和攻击,否则将触犯法律。
五、总结
Linux 系统安全是一个系统性的工程,并非单一的配置或工具就能实现全面防护,而是需要从账号安全 、引导登录安全 、风险检测三个维度进行层层把控,结合精细化的配置和定期的安全扫描,构建起一套完整的安全防护体系。
本文详细讲解了 Linux 账号安全控制的核心机制,包括系统账号清理、密码安全管控、su/sudo 的权限管理;系统引导和登录控制的 BIOS 配置、GRUB 密码设置、临时登录限制;以及弱口令检测工具 John the Ripper、端口扫描工具 NMAP 的实操使用。通过这些措施,能够有效封堵系统的安全漏洞,降低被恶意攻击的风险:
- 账号安全是系统的第一道防线,通过锁定冗余账号、设置密码有效期、精细化的 sudo 权限分配,可确保账号的正当使用,避免权限滥用;
- 引导和登录控制从物理和本地层面保护系统,防止未授权人员的本地操作,弥补远程管理的安全盲区;
- 弱口令检测和端口扫描是风险排查的关键手段,定期扫描可及时发现隐性安全隐患,做到 "早发现、早修复"。
在实际的生产环境中,除了本文介绍的内容,管理员还需结合防火墙配置 (如 iptables、firewalld)、系统日志审计 、漏洞补丁更新 、数据备份等措施,不断提升系统的安全防护能力。同时,要树立安全意识,遵循 "权限最小化" 原则,定期开展安全演练和风险评估,才能在复杂的网络环境中保障 Linux 系统的安全、稳定、可靠运行。