作为一种开放源代码的操作系统,Linux服务器以其安全,高效和稳定的显著优势得以广泛应用
可以从账号安全控制,系统引导和登录控制的角度控制Linux系统的安全优化
还可以使用基于Linux系统环境的弱口令检测,网络扫描等安全工具,查找隐患,及时采取有针对性的防护措施
将非登录用户的Shell设为/sbin/nologin
在Linux系统中,除了用户手动创建的各种账号之外,还包括随系统或程序安装过程而产生的其他大量账号
除了root之外,其他大量账号只是用来维护系统运作,启动或保持服务进程,一般是不允许登录的,也称为非登录用户
常见的非登录用户包括bin,daemon,adm,lp,mail,nobody,apache,mysql,dbus,ftp,gdm,haldaemon等
为了确保系统安全,这些用户的登录shell通常是/sbin/nologin,表示禁止终端登录,应确保不被人为改动
对于长期不用的用户账号,若无法确定是否删除,可以暂时将其锁定,(passwd,usermod命令都可以用来锁定和解锁账号)
[root@localhost ~]# usermod -L tom1 ##锁定tom1用户密码
[root@localhost ~]# passwd -S tom1 ##查看tom1用户密码状态
tom1 LK 2020-06-22 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# usermod -U tom1 ##解锁tom1用户密码
在非登录用户中,还有一部分是很少用到的,如news,uucp,games,gopher等,这些用户可视为冗余账号,可以直接删除
此外,还有一些随着应用程序安装的用户账号,若程序卸载以后未能自动删除,需要人为手动删除
如果服务器中的用户账号已经固定,不在进行更改,还可以采取锁定账号配置文件的方法
使用chattr命令,分别结合“+i”“-i”选项来锁定,解锁文件,使用lsattr命令可以查看文件锁定情况
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow ##锁定passwd/shadow文件
[root@localhost ~]# lsattr /etc/passwd /etc/shadow ##查看passwd/shadow文件是否锁定
----i----------- /etc/passwd
----i----------- /etc/shadow
[root@localhost ~]# useradd tom3 ##尝试添加tom3用户
useradd:无法打开 /etc/passwd ##无法添加
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow ##解锁passwd/shadow文件
[root@localhost ~]# useradd tom3 ##可以创建用户
在不安全的网络环境中,为了降低密码被猜出或者被暴力破解的风险,用户应养成定期修改密码的习惯,避免长期使用同一个密码
管理员可以在服务器端限制用户密码的最大有效天数
对于密码已经过期的用户,登录时将被要求重新设置密码,否则拒绝登录
对于未创建的用户,使用此命令修改配置文件
对于已创建的用户,用这条命令
[root@localhost ~]# chage -M 30 tom2
[root@localhost ~]# chage -d 0 tom1
重新登录后,必须更改密码((重设的密码有密码复杂性要求,例如不可是连续的数字,连续的字母等))
例如:设置最多只记录200条历史命令
[root@localhost ~]# vi /etc/profile
将其中的HISTSIZE=1000,修改为HISTSIZE=200
[root@localhost ~]# source /etc/profile ##使用命令source /etc/profile或者换重启使之生效
注销时自动清空命令历史:修改用户宿主目录中的~/.bash_logout文件,添加清空历史命令的操作语句。即:当用户注销(退出已登录的bash环境)时,所记录的历史命令将自动清空
[root@localhost ~]# vi .bash_logout
#~/.bash_logout
rm -rf .bash_history ##删除此文件
history -c ##清除历史命令
clear
[root@localhost ~]# vi /etc/profile ##适用于新登录用户
export TMOUT=20 ##将闲置时间设为20S
[root@localhost ~]# source /etc/profile ##使设置生效
[root@localhost ~]# export TMOUT=30 ##对当前用户生效
将允许使用su命令的用户加入wheel组
[root@localhost ~]# id tom1 ##查看tom1的用户信息
uid=1002(tom1) gid=1002(tom1) 组=1002(tom1)
[root@localhost ~]# gpasswd -a tom1 wheel ##将tom1加入wheel组
正在将用户“tom1”加入到“wheel”组中
[root@localhost ~]# id tom1
uid=1002(tom1) gid=1002(tom1) 组=1002(tom1),10(wheel)
[root@localhost ~]# vi /etc/pam.d/su ##编辑配置文件
...
auth required pam_wheel.so use_uid ##将此行行首的#号删除
[root@localhost ~]# su - tom2 ##切换到tom2用户,此未加入到wheel组中
上一次登录:一 6月 22 11:33:49 CST 2020tty3 上
[tom2@localhost ~]$ su - tom1 ##无法使用su命令
密码:
su: 拒绝权限
[tom2@localhost ~]$ exit ##退出
[root@localhost ~]# su - tom1 ##切换到tom1用户
[tom1@localhost ~]$ su - root ##tom1可以使用su命令
密码:
上一次登录:一 6月 22 17:33:34 CST 2020pts/0 上
默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root) 的登录密码,带来安全风险
为了加强su命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su命令进行切换
PAM(Pluggable Authentication Modules)可插拔式认证模块
●是一种高效而且灵活便利的用户级别的认证方式
●也是当前Linux服务器普遍使用的认证方式
1.required验证失败时仍然继续,但返回Fail
2. requisite验证失败则立即结束整个验证过程,返回Fail
3. sufficient验证成功则立即返回,不再继续,否则忽略结果并继续
4. optional不用于验证,只显示信息(通常用于session类型)
用过su命令可以非常方便的切换为另一个用户,但前提条件是必须知道目标用户的登录密码
对于生产环境中的Linux服务器,每多一个人知道特权密码,其安全风险也就增加一分
sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码
语法格式:sudo [参数]
visudo 或者 vi /etc/sudoers :sudo机制的配置文件为/etc/sudoers,文件的默认权限是440,需要使用专门的visudo工具进行编辑。若使用vi编辑,保存时必须执行“:w!”命令强制操作,否则系统将提示为只读文件而拒绝保存
[root@localhost ~]# visudo
...
## Same thing without a password
tom1 localhost=/sbin/ifconfig ##tom1在本地主机拥有ifconfig权限
%wheel ALL=(ALL) NOPASSWD: ALL
[root@localhost ~]# su - tom2 ##我们先切换到tom2用户
[tom2@localhost ~]$ sudo ifconfig ens33 11.11.11.11 ##尝试更改IP地址
[sudo] tom2 的密码:
tom2 不在 sudoers 文件中。此事将被报告。 ##无法修改IP地址
[tom2@localhost ~]$ exit ##登出
[root@localhost ~]# su - tom1 ##切换到tom1用户
[tom1@localhost ~]$ sudo ifconfig ens33:2 11.11.11.11 ##修改网卡地址
[sudo] tom1 的密码:
[tom1@localhost ~]$ ifconfig ##修改成功
...
[root@localhost ~]# visudo
tom1 localhost=/sbin/*,!/sbin/ifconfig,!/sbin/route ##tom1用户拥有/sbin下所有权限,除了/sbin/ifconfig和/sbin/route
*:通配符号
!:取反符号
%:代表组
将第一引导设备设为当前系统所在硬盘
禁止从其他设备(光盘,U盘,网络)引导系统
将安全级别设为setup,并设置管理员密码
使用grub2-setpassword生成秘钥
[root@localhost ~]# grub2-setpassword ##生成grub2菜单密码
Enter password:
Confirm password:
[root@localhost ~]# cat /boot/grub2/user.cfg ##查看密码是否添加
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.C3428AF0D7A62E00D540E2C8F9014F64CE6CDAD3632BD5B1D388AA09F6EE038B9494BD1E5B98AA7C7E97BC4936BDF34D8B08158E04009461BB4807BA13953D5D.DBAE85EFE16710D093B543E210F1636880957802C82141ECCB688E5D021B46DFA42778BDAF4E72C63BFC25427B78EE28BA92917A800B444556DA4D8968E1035E
[root@localhost ~]# reboot ##重新启动
[root@localhost ~]# vi /etc/securetty
建立/etc/nologin文件
删除nologin文件重启后即恢复正常
[root@localhost ~]# touch /etc/nologin ##创建此文件后其他用户已经无法登陆
[root@localhost ~]# rm -rf /etc/nologin ##删除此文件即可取消限制
一款密码分析工具,支持字典式的暴力破解
通过对shadow文件的口令分析,可以检测密码强度
[root@localhost opt]# tar zxvf john-1.8.0.tar.gz ##进行解压
[root@localhost opt]# cd john-1.8.0/ ##进入解压后的目录
[root@localhost john-1.8.0]# cd src/ ##进入src目录
[root@localhost src]# make clean linux-x86-64 ##进行编译
[root@localhost src]# cd /opt/john-1.8.0
[root@localhost john-1.8.0]# cd run ##进入run目录
[root@localhost run]# cp /etc/shadow /root/shadow.txt ##拷贝shadow文件到/root/shadow.txt
[root@localhost run]# ./john /root/shadow.txt ##执行暴力破解
Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
123456 (root) ##破解成功
123456 (tom2)
2g 0:00:01:42 17% 2/3 0.01947g/s 355.0p/s 356.9c/s 356.9C/s kevin2..rocky2
Use the "--show" option to display all of the cracked passwords reliably
Session aborted
其中,扫描目标可以是主机名、IP地址或网络地址等,多个目标以空格分隔;常用的选项有“-p“"-n”,分别用来指定扫描的端口、禁用反向DNS解析(以加快扫描速度);扫描类型决定着检测的方式,也直接影响扫描的结果。
比较常用的几种扫描类型如下
[root@localhost run]# nmap -sP 192.168.179.100-200 ##查看此网段内有哪些主机在线
Starting Nmap 6.40 ( http://nmap.org ) at 2020-06-22 19:48 CST
Nmap scan report for 192.168.179.144
Host is up.
Nmap done: 101 IP addresses (1 host up) scanned in 4.12 seconds
[root@localhost run]# nmap -sT 192.168.179.144 ##查看主机192.168.179.144开了哪些TCP端口
Starting Nmap 6.40 ( http://nmap.org ) at 2020-06-22 19:51 CST
Nmap scan report for 192.168.179.144
Host is up (0.0013s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds