作为一种开放源代码的操作系统, Linux 服务器以其安全, 高效和稳定的显著优势而得以广泛的应用. 随着而来的就是 --Linux 系统的安全问题.
本篇博客主要围绕 Linux 系统的安全问题:
一, 账号安全控制;
二, 系统引导和登录控制;
三, 弱口令检测, 端口扫描.
一, 账号安全控制
用户账号是计算机使用者的身份凭证或标识, 每个要访问系统资源的人, 必须凭借其用户账号才能进入计算机. 在 Linux 系统中, 提供了多种机制来确保用户账号的正当, 安全地使用.
1. 基本 (必要) 的安全措施
(1)系统账号的清理
在 Linux 系统中, 除了用户手动创建的各种账号之外, 还包括随系统或程序安装过程而产生的其他大量的系统账号. 除了超级用户 root 之外, 其他大量账号只是用来维护系统运行服务进程, 一般情况是绝不允许登录系统的, 因此也被称为非登录用户账号.
常见的非登录用户账号的登录 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
- operator:x:11:0:operator:/root:/sbin/nologin
- games:x:12:100:games:/usr/games:/sbin/nologin
- ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
- .................. // 省略部分内容
各种非登录用户账号中, 还有相当一部分是很少用到的, 比如 games. 这些用户账号被称为冗余账号(建议删除). 除此之外, 还有一些随应用程序安装的用户账号, 若卸载应用程序后未能自动删除, 则需管理员手动将其删除.
对于 Linux 服务器中长期不用的用户账号, 若无法确定是否应该删除, 可以暂时将其锁定. 比如:
- [root@localhost ~]# usermod -L q1 // 锁定账号
- [root@localhost ~]# passwd -S q1 // 查看账号状态
- q1 LK 2019-08-27 0 99999 7 -1 (密码已被锁定.)
- [root@localhost ~]# usermod -U q1 // 解锁账号
- [root@localhost ~]# passwd -S q1
- q1 PS 2019-08-27 0 99999 7 -1 (密码已设置, 使用 SHA512 算法.)
如果服务器中的用户账号已经固定, 不再进行修改, 还可以采取锁定账号配置文件的方法, 进一步保障账号的安全性. 比如:
- [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
在账号文件被锁定的情况下, 其内容将不允许被修改. 因此也就无法添加, 删除账号, 也不能更改用户的密码, 登录 shell, 宿主目录等属性信息.
- [root@localhost ~]# chattr +i /etc/passwd /etc/shadow
- [root@localhost ~]# lsattr /etc/passwd /etc/shadow
- ----i----------- /etc/passwd
- ----i----------- /etc/shadow
- [root@localhost ~]# useradd a1
useradd: 无法打开 /etc/passwd
(2)密码安全控制
在不安全的网络环境中, 为了降低密码被猜出或被暴力破解的风险, 用户应养成定期修改密码的习惯, 避免长期使用同一个密码. 管理员可以在服务器端限制用户密码的最大有效天数, 对于密码已过期的用户, 登录时被要求重新设置密码, 否则将拒绝登录.
以下操作可以将密码的有效期设为 30 天:
- [root@localhost ~]# VIM /etc/login.defs // 适用于修改完文件新建的用户
- .................. // 省略部分内容
- PASS_MAX_DAYS 30 // 默认存在, 修改即可
- [root@localhost ~]# chage -M 30 q1 // 适用于已经存在的 q1 用户
在某些特殊情况下, 如要求批量创建用户初次登录时必须自设密码. 比如:
- [root@localhost ~]# chage -d 0 q1 // 新建的用户, 已存在的用户都适用
- Localhost login:q1
- password:
- You are required to change your password immediately (root enforced)
- WARNING: Your password has expired.
- You must change your password now and login again!
更改用户 q1 的密码 .
为 q1 更改 STRESS 密码.
(当前)UNIX 密码:
(3)命令历史, 自动注销
Shell 环境的命令历史机制为用户提供了极大的便利, 但另一方面也给用户带来了潜在的风险, 只要获得用户的命令历史文件, 该用户的命令操作过程将会一览无遗, 如果曾经在命令行输入了明文的密码, 则会给服务器带来巨大的风险.
Bash 终端环境中, 历史命令的记录条目是由变量 HISTSIZE 控制, 默认是 1000 条, 通过修改其配置文件, 可以影响系统中的所有用户. 比如:
- [root@localhost ~]# VIM /etc/profile // 适用于新登录的用户
- ............ // 省略部分内容, 添加以下内容
- HISTSIZE=200
- [root@localhost ~]# export HISTSIZE=200
- // 适用于当前用户, export 的作用: 将一个变量设置为全局变量
除此之外, 还可以修改用户宿主目录中的~/.bash_logout 文件, 添加情况历史命令的操作语句:
- [root@localhost ~]# VIM ~/.bash_logout // 打开配置文件, 添加以下内容
- history -c // 清空历史命令
- clear // 清屏
这样, 当用户退出已登录 Bash 环境后, 所记录的历史命令将自动清空.
Bash 终端环境中, 还可以设置一个闲置超时时间, 当超过指定的时间见没有任何输入时自动注销终端, 这样可以有效避免当管理员不在时其他人员对服务器的误操作风险, 闲置超时由变量 TMOUT 来控制, 默认单位为秒(s).
- [root@localhost ~]# VIM /etc/profile // 适用于新登录的用户
- ............ // 省略部分内容, 添加以下内容
- export TMOUT=600
- [root@localhost ~]# export TMOUT=600 // 适用于当前用户
注意: 当正在执行程序代码编译时, 修改系统配置等耗时较长的操作时, 应避免设置 TMOUT 变量. 必要时可以使用 "unset TMOUT" 命令取消 TMOUT 变量设置.
2. 用户切换与提权
大多数 Linux 服务器并不建议用户直接以 root 用户进行登录, 一方面可以大大减少因误操作而导致的破坏; 另一方面也降低了特权密码在不安全的网络中被泄露的风险. 针对这些原因, 需要为普通用户提供一种身份或权限提升机制, 以便在必要的时候执行管理任务.
Linux 系统为我们提供了 su,sudo 两种命令, 其中 su 命令主要用来切换用户, 而 sudo 命令用来提升执行权限.
(1)su 命令 -- 切换用户
使用 su 命令, 可以切换为指定的另一个用户, 从而具有该用户的所有权限. 当然, 切换时需要对目标用户的密码进行验证(从 root 用户切换为其他用户时除外). 例如:
- [root@localhost ~]# su - xiaoli
- [xiaoli@localhost ~]$ su - root
密码: // 输入用户 root 密码
[root@localhost ~]# // 验证成后获得 root 权限
上述命令中, 选项 "-" 等同于 "--login" 或 "-l", 表示切换用户后进入目标用户的登录 shell 环境, 若不添加 "-" 选项, 则表示仅切换身份, 不切换用户环境. 对于切换为 root 用户的情况时,"root" 可以省略.
默认情况下, 任何用户都允许使用 su 命令. 从而有机会反复尝试其他用户 (如 root) 的登录密码. 这样带来了很大的安全风险, 为了加强 su 命令的使用控制, 可以借助于 pam_wheel 认证模块, 只允许极个别用户可以使用 su 命令进行切换. 实现过程:
- [root@localhost ~]# gpasswd -a xiaoli wheel
- // 正在将用户 "xiaoli" 加入到 "wheel" 组中
- [root@localhost ~]# grep "wheel" /etc/group
- wheel:x:10:xiaoli
- [root@localhost ~]# VIM /etc/pam.d/su
- auth sufficient pam_rootok.so // 默认存在
- ............ // 省略部分内容
- auth required pam_wheel.so use_uid // 默认存在, 去掉 "#" 号即可!
- ............ // 省略部分内容
启用 pam_wheel 认证后, 未加入 wheel 组内的其他用户将无法使用 su 命令, 尝试进行切换时, 将提示 "拒绝权限", 从而将切换用户的权限控制在最小范围内.
[xiaozhang@localhost ~]$ su - root
密码: // 不论密码正确与否, 都将提示拒绝权限
su: 拒绝权限
对用户的任何操作 (添加, 删除, 切换) 等操作都将记录在 / var/log/secure 文件中, 根据需要即可进行查看.
(2)sudo 命令 -- 提升执行权限
通过 su 命令可以非常方便地切换到另一个用户, 但是前提条件是必须知道目标用户的登录密码(从 root 用户切换为其他用户时除外), 从任意用户切换至 root 用户就必须得知道 root 用户的密码. 对于生产环境中的 Linux 服务器, root 用户的密码, 知道的人, 越少越好, 否则就会存在巨大的风险.
有一种方法, 既可以让普通用户拥有一部分的管理权限, 又不需要知道 root 用户的密码, 那就是使用 --sudo 命令.
使用 sudo 命令皆可以提升执行权限. 不过, 需要由管理员预先执行授权, 指定哪些用户以超级用户 (或其他用户) 的身份来执行哪些命令.
1)在配置文件 / etc/sudoers 中添加授权
sudo 机制的配置文件为 / etc/sudoers, 文件的默认权限是 400, 需使用专门的 visudo 工具进行编写, 虽然可以通过 "vim" 进行编辑, 但是保存时必须执行 ":w!" 命令强制操作, 否则系统将提示只读文件而拒绝保存.
配置文件 / etc/sudoers 中, 授权记录的基本配置格式:
用户 主机名列表 = 命令程序列表
授权配置主要包括用户, 主机, 命令三个部分, 即授权哪些人在哪些主机上执行哪些命令. 各部分的具体含义:
用户: 直接授权指定的用户名, 或者采用 "% 组名" 的方式(授权一个组的所有用户);
主机: 使用此配置文件的主机名称. 此部分主要是方便在多个主机间共用一份 sudoers 文件, 一般设置为 localhost 或实际的主机名即可;
命令: 允许授权的用户通过 sudo 方式制定的特权命令, 需填写命令程序的完整路径, 多个命令执行用逗号 "," 进行分隔;
典型的 sudo 配置记录中, 每行对应一个用户或组的 sudo 授权配置. 比如:
- [root@localhost ~]# visudo
- .................. // 省略部分内容
- xiaozhang localhost=/sbin/ifconfig // 允许用户 xiaozhang 在本机使用 ifconfig 命令
- %wheel ALL=NOPASSWD:ALL // 允许 wheel 组中的成员在任意主机上不需要使用密码即可执行任意命令
当使用相同授权的用户较多, 或者授权的命令较多时, 可以采用集中定义的别名. 用户, 主机, 命令部分都可以定义为别名 (必须为大写) 分别通过关键字 User_Alias,Host_Alias,Cmnd_Alias 来进行设置. 比如:
- [root@localhost ~]# visudo
- .................. // 省略部分内容
- User_Alias OPERATORS=user1,user2,user3 // 定义用户名列表
- Host_Alias MAILSVRS=smtp,pop // 定义主机列表
- Cmnd_Alias PKGTOOLS=/bin/rpm,/usr/bin/yum // 定义命令列表
- OPERATORS MAILSVRS=PKGTOOLS // 使定义的列表全部关联起来
sudo 配置记录的命令部分允许使用通配符 "*", 取反符号 "!", 当需要授权某个目录下的所有命令或取消其中个别命令时特别有用. 比如:
- [root@localhost ~]# visudo
- .................. // 省略部分内容
- xiaowang localhost=/bin/*,!/bin/passwd root
- // 允许 xiaowang 用户在本机使用 / bin 路径下的所有命令, 但是不允许给 root 用户修改密码
通常情况下, 通过 sudo 方式执行的操作并不记录, 若要启用 sudo 日志记录以备查看, 应该这么做:
- [root@localhost ~]# visudo
- .................. // 省略部分内容
- Defaults logfile="/var/log/sudo"
2)通过 sudo 执行特权命令
对于已获得授权的用户, 通过 sudo 方式执行特权命令时, 只需在正常的命令前加 "sudo" 即可!
- [xiaosun@localhost ~]$ sudo ifconfig ens33 192.168.1.1/24
- We trust you have received the usual lecture from the local System
- Administrator. It usually boils down to these three things:
- #1) Respect the privacy of others.
- #2) Think before you type.
- #3) With great power comes great responsibility.
- [sudo] password for xiaosun:
xiaosun 不在 sudoers 文件中. 此事将被报告.
- // 因为 xiaosun 没获得特权命令的授权
- [xiaozhang@localhost ~]$ ifconfig ens33 192.168.1.1/24
SIOCSIFADDR: 不允许的操作
SIOCSIFFLAGS: 不允许的操作
SIOCSIFNETMASK: 不允许的操作
- [xiaozhang@localhost ~]$ sudo ifconfig ens33 192.168.1.1/24
- We trust you have received the usual lecture from the local System
- Administrator. It usually boils down to these three things:
- #1) Respect the privacy of others.
- #2) Think before you type.
- #3) With great power comes great responsibility.
- [sudo] password for xiaozhang:
- // 执行命令时需要输入自己的密码进行验证(如果不希望输入密码应在命令前添加 "NOPASSWD")
- //xiaozhang 可以使用特权命令(已经获得授权)
在当前会话中, 第一次通过 sudo 执行命令时, 必须知道用户本身的密码 (并不是 root 的密码) 进行验证, 此后再使用 sudo 命令时, 只要与前一次 sudo 操作的间隔时间不超过 5 分钟, 则不需要重复验证.
若想查看用户自己获得哪些特权命令, 环境变量, 可以执行 "sudo -l" 命令.
- [xiaozhang@localhost ~]$ sudo -l
- [sudo] password for xiaozhang:
匹配此主机上 xiaozhang 的默认条目:
- !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME
- HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG
- LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION
- LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC
- LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS
- _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin,
- logfile=/var/log/sudo
用户 xiaozhang 可以在该主机上运行以下命令:
- (root) /sbin/ifconfig
- // 查看已经授权的用户
- [root@localhost ~]# su - xiaosun
上一次登录: 二 8 月 27 21:41:40 CST 2019pts/0 上
- [xiaosun@localhost ~]$ sudo -l
- [sudo] password for xiaosun:
对不起, 用户 xiaosun 不能在 localhost 上运行 sudo.
// 查看为授权的用户
如果启用 sudo 日志, 则可以查看用户 sudo 的操作记录.
- [root@localhost ~]# tail /var/log/sudo
- Aug 27 21:41:07 : xiaoli : TTY=pts/0 ; PWD=/home/xiaoli ; USER=root ;
- COMMAND=/sbin/ifconfig ens33 192.168.1.1/24
- Aug 27 21:42:53 : xiaozhang : TTY=pts/0 ; PWD=/home/xiaozhang ; USER=root ;
- COMMAND=/sbin/ifconfig ens33 192.168.1.1/24
二, 系统引导和登录控制
在互联网环境中, 大部分服务器是通过远程登录的方式来进行管理的, 而本地引导和终端登录往往容易被忽视, 从而留下安全隐患. 特别是当服务器所在的机房环境却反严格, 安全的管理制度时, 如何防止其他用户的非法介入就成为必须重视的问题.
1. 开关机安全控制
对于服务器主机, 除了物理上的安全防护之外. 在开关机安全控制方面, 除了要做好物理安全防护以外, 还要做好系统本身的一些安全措施.
(1)调整 BIOS 引导设置
将第一引导设备设为当前系统所在硬盘;
禁止从其他设备 (光盘, U 盘, 网络) 引导系统;
将安全级别设为 setup, 并设置管理员密码;
(2)禁止 ctrl+Alt+Del 快捷键重启
快捷键重启功能为服务器本地维护提供了方便, 但对于多终端登录的 Linux 服务器, 禁用此功能是比较安全的选择. 操作如下:
- [root@localhost ~]# cat /etc/inittab // 查看提供 ctrl+Alt+Del 快捷键的文件
- .................. // 省略部分内容
- # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
- [root@localhost ~]# ll /usr/lib/systemd/system/ctrl-alt-del.target
lrwxrwxrwx. 1 root root 13 7 月 14 18:54 /usr/lib/systemd/system/ctrl-alt-del.target -> reboot.target
// 查看得知它是 reboot.target 文件的软连接
不影响 reboot.target 文件的前提下执行以下命令即可禁用 ctrl+Alt+Del 快捷键
- [root@localhost ~]# systemctl mask ctrl-alt-del.target // 注销 ctrl+Alt+Del 服务
- Created symlink from /etc/systemd/system/ctrl-alt-del.target to /dev/null.
- [root@localhost ~]# systemctl daemon-reload // 重新加载 systemd 配置
- [root@localhost ~]# systemctl unmask ctrl-alt-del.target // 重新开启 ctrl+Alt+Del 服务
- Removed symlink /etc/systemd/system/ctrl-alt-del.target.
- [root@localhost ~]# systemctl daemon-reload // 重新加载 systemd 配置
(3)限制更改 GRUB 引导参数
从系统安全的角度来看, 如果人很都能够修改 GRUB 引导参数, 对服务器本身显然是一个极大的安全隐患. 为了加强对引导过程的安全控制, 可以为 GRUB 菜单设置一个密码, 只有提供正确的密码才被允许修改引导参数.
为 GRUB 菜单设置的密码建议采用 "grub2-mkpasswd-pbkdf2" 命令生成.
为 GRUB 菜单设置的密码建议采用 "grub2-mkpasswd-pbkdf2" 命令生成.
[root@localhost ~]# grub2-mkpasswd-pbkdf2 // 根据提示输入密码
输入口令:
- Reenter password:
- PBKDF2 hash of your password is
- //"is" 之后是经过加密的密码字串符(由于限制, 不可发布)
- [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
- // 建议做个备份(实验环境, 无所谓)
- [root@localhost ~]# VIM /etc/grub.d/00_header // 这是通过密钥工具生成密码的配置文件
- ........................ // 省略部分内容
- cat <<EOF
- set superusers="root" // 设置用户名
- password_pbkdf2 root
- // 填写刚才通过密钥工具生成的密钥文件(就是刚才生成密钥文件 "is" 之后的内容, 由于限制不可发布)
- // 设置用户名的密码
- EOF
- [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
- // 重新生成配置文件
重新计算机测试, 按 "e" 键进入 GRUB 菜单时, 将提示:
输入正确的用户名和密码方可进入(实验用的是 root, 跟系统中的 root 没有任何关系)!
2. 终端及登录控制
(1)限制 root 用户的登录
在 Linux 系统中, login 程序会读取 / etc/securetty 文件, 以决定 root 用户从哪些终端上登录系统.
- [root@localhost ~]# VIM /etc/securetty
- ........................ // 省略部分内容
- #tty5
- #tty6
- // 禁止 root 用户从 tty5,tty6 登录系统
(2)禁止普通用户登录
当服务器正在进行备份或调试等维护工作时, 可能不希望再有新的用户登录系统, 这时, 只需建立 / etc/nologin 空文件即可; 反之则允许普通用户登录.
- [root@localhost ~]# touch /etc/nologin // 禁止普通用户登录
- [root@localhost ~]# rm -rf /etc/nologin // 允许普通用户登录
注意: 仅建议在服务器维护期间, 测试期间使用!
三, 弱口令检测, 端口扫描
本次实验使用的安全工具是 --John the Ripper 和 NMAP.
John the Ripper 工具网盘链接: https://pan.baidu.com/s/1HQNCPFnKNBQWmjSNSEZ7_Q
提取码: q1b0
NMAP 工具使用 yum 安装即可!
1. 弱口令检测工具 --John the Ripper
对于任何一个承担着安全责任的管理员, 及时找出这些弱口令是非常必要的, 这样便于采取进一步的安全措施(修改口令).
John the Ripper 是一款开源的密 码 破 解 工具, 能够在已知密文的情况下快速分析出明文的密码字串, 支持 DES,MD5 等多种加密算法, 而且允许使用字典进行破解.
(1)安装 John the Ripper
- [root@localhost ~]# tar zxf john-1.8.0.tar.gz -C /usr/src
- [root@localhost ~]# cd /usr/src/john-1.8.0/
- [root@localhost john-1.8.0]# ls
- doc README run src
- //doc 目录是手册文档, README 是链接的说明文件, run 是运行程序, src 是源码文件
- [root@localhost john-1.8.0]# cd src
- [root@localhost src]# make clean Linux-x86-64
- // 通过这种方式进行编译
- [root@localhost src]# cd ../run
- [root@localhost run]# ls
- ascii.chr john lm_ascii.chr makechr relbench unique
- digits.chr john.conf mailer password.lst unafs unshadow
- // 确认有 john 可执行程序产生
(2)检测弱口令账号
以实验环境 Linux 系统为例(如果检测别的密文文件, 可以复制一份到本地):
- [root@localhost run]# ./john /etc/shadow
- 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 (user1)
- 123456 (xiaowang)
- 123456 (xiaosun)
- 123456 (xiaoli)
- 123456 (xiaozhang)
.................. 按 Ctrl+C 组合键终止后续过程
// 密码破译需要时间, 需耐心等待
(3)使用密码字典进行破解
- [root@localhost run]# :>john.opt
- // 情况已破解的账户列表, 以便重新分析, 破解
- [root@localhost run]# ./john --wordlist=./password.lst /etc/shadow
- // 使用工具本身自带的密码字典进行破解
- 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 (user1)
- 123456 (xiaowang)
- 123456 (xiaosun)
- 123456 (xiaoli)
- 123456 (xiaozhang)
.................. 按 Ctrl+C 组合键终止后续过程
2. 网络扫描工具 --NMAP
(1)安装 NMAP 软件包
[root@localhost ~]# yum -y install nmap
(2)扫描语法及类型
nmap [扫描类型] [选项] <扫描目标 ...>
常用的选项有:
"-p" 用来指定扫描的端口信息;
"-n" 表示禁用反向 DNS 解析(加快扫描速度);
常用的几种扫描类型, 如图:
(3)扫描操作示例
- [root@localhost ~]# nmap 127.0.0.1
- // 扫描本机开启的 TCP 端口
- [root@localhost ~]# nmap -sU 127.0.0.1
- // 扫描本机开启的 UDP 端口
- [root@localhost ~]# nmap -p 21 192.168.1.0/24
- // 扫描 192.168.1.0 网段中哪些主机提供了 FTP 服务
- [root@localhost ~]# nmap -n -sP 192.168.1.0/24
- // 扫描 192.168.1.0 网段存活的主机(可以 ping 通)
- [root@localhost ~]# nmap -p 139,445 192.168.1.0/24
- // 扫描 192.168.1.0 网段中开启共享服务的主机
可以根据实际的需求更换不同的选项!
来源: http://blog.51cto.com/14157628/2433030