1 账号安全基本措施
1.1 系统账号清理
1.1.1 将非登录用户的Shell设为/sbin/nologin
在我们使用Linux系统时,除了用户创建的账号之外,还会产生系统或程序安装过程中产生的许多其他账号,除了超级用户root外,其他账号都是用来维护系统运作的,一般不允许登录,常见的非登录用户有bin、adm、mail、lp、nobody、ftp等。
查看/etc/passwd 文件,可以看到多个程序用户。
使用usermod命令修改登录shell:
usermod -s /sbin/nologin 用户名
示例:
将user02的登录shell修改为/sbin/nologin,修改后user02无法登录系统。
[root@localhost ~]# grep "user02" /etc/passwd //查看用户user02的登录shell,为bash
user02:x:2001:2001::/tmp/test:/bin/bash
[root@localhost ~]# usermod -s /sbin/nologin user02 //将user02的登录shell修改为/sbin/nologin
[root@localhost ~]# grep "user02" /etc/passwd
user02:x:2001:2001::/tmp/test:/sbin/nologin
1.1.2 锁定长期不使用的账号
命令:
方法一:
passwd -l 用户名 //锁定用户
passwd -u 用户名 //解锁用户
方法二:
usermod -L 用户名 //锁定用户
usermod -U 用户名 //解锁用户
示例:
1)passwd -l 用户名,锁定用户。锁定后用户无法登录。
[root@localhost ~]# passwd -l user03 //锁定用户user03的密码
锁定用户 user03 的密码 。
passwd: 操作成功
[root@localhost ~]# passwd -S user03 //查看user03状态
user03 LK 2022-03-05 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# passwd -u user03 //解锁用户user03的密码
解锁用户 user03 的密码。
passwd: 操作成功
2)usermod -L 用户名,锁定用户。锁定后用户无法登录。
[root@localhost ~]# usermod -L user04 //锁定用户user04
[root@localhost ~]# passwd -S user04 //查看用户user04的状态
user04 LK 2022-03-05 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# usermod -U user04 //解锁用户user04
[root@localhost ~]# passwd -S user04 //查看用户user04的状态
user04 PS 2022-03-05 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
1.1.3 删除无用的账号
命令:
userdel 用户名 //删除用户,但不删除用户的家目录
userdel -r 用户名 //删除用户的同时,删除他的家目录
#加上-r才能删除用户的家目录。如果不删除家目录,那么用户被删除后,他的家目录会变成无主文件,文件的属主和属组位显示的是原主人的UID和GID。
命令:
1)userdel 用户名。删除用户,但不删除用户的家目录。
用户被删除后,他的家目录会变成无主文件,文件的属主和属组位显示的是原主人的UID和GID。
[root@localhost ~]# userdel user05
[root@localhost ~]# ls /home
alice apache jack user01 user04 user07 zhangsan
Amy helen nancy user03 user05 yuji
[root@localhost ~]# ls -dl /home/user05
drwx------. 3 2004 2004 78 2月 21 20:29 /home/user05
2)userdel -r 用户名。删除用户的同时删除他的家目录。
[root@localhost ~]# ls /home
alice apache jack user01 user04 user07 yuji
Amy helen nancy user03 user05 user08 zhangsan
[root@localhost ~]# userdel -r user07 //删除用户的同时删除家目录
[root@localhost ~]# ls /home
alice apache jack user01 user04 user08 zhangsan
Amy helen nancy user03 user05 yuji
1.1.4 锁定账号文件passwd、shadow
chattr命令改变文件属性,lsattr命令查看文件底层属性。
命令格式:
chattr [-RV] [+/-/=<属性>] 文件或目录 //改变文件属性
lsattr 文件或目录 //查看文件底层属性
选项说明:
-R:递归处理,将指定目录下的所有文件及子目录一并处理。
-V:显示指令执行过程。
属性:
属性 | 作用 |
---|---|
a(append) | 只允许对文件进行追加操作(适用于日志文件) |
A | 不允许更新文件的访问时间 |
c (compressed) | 启用这个属性时,文件在磁盘上会自动压缩 |
d (dump) | 不能使用dump命令备份文件 |
D | 设置了目录的D属性时,更改会同步保存在磁盘上 |
e (extent for mat) | 它表明,该文件使用磁盘上的块的映射扩散 |
i (immutable) | 在文件上启用这个属性时,我们不能更改、重命名或删除这个文件 |
j (journaling) | 设置了这个属性时,文件的数据首先保存在日志中,然后再写入文件 |
S (synchronous) | 设置了这个属性时,变更或更改同步保存到磁盘上 |
常用属性:
chattr +a 文件或目录 //只允许对文件进行追加操作(适用于日志文件)
chattr +i 文件或目录 //不能更改、重命名或删除这个文件
示例:
使用”chattr +i“为文件增加i属性,之后不能更改、重命名或删除这个文件。
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow //为两个文件增加i属性
[root@localhost ~]# lsattr /etc/passwd /etc/shadow //查看文件底层属性
----i----------- /etc/passwd
----i----------- /etc/shadow
[root@localhost ~]# useradd mike //尝试创建用户,创建失败
useradd:无法打开 /etc/passwd
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow //去掉两个文件的i属性
[root@localhost ~]# lsattr /etc/passwd /etc/shadow
---------------- /etc/passwd
---------------- /etc/shadow
示例:
1.2 密码安全控制——设置密码规则
一般通过设置密码规则来控制密码安全,主要设置以下两点:
- 设置密码有效期
- 要求用户下次登录时修改密码
1.2.1 对于新建用户——修改/etc/login.defs文件
对于新建用户,可以修改/etc/login.defs文件里的内容来设置密码规则。
查看/etc/login.defs文件:
参数说明:
PASS_MAX_DAYS #密码最大有效期 PASS_MIN_DAYS #两次修改密码的最小间隔时间 PASS_MIN_LEN #密码最小长度,对于root无效 PASS_WARN_AGE #密码过期前多少天开始提醒
示例:
修改/etc/login.defs文件,将密码最大有效期修改为30天。
[root@localhost ~]# vim /etc/login.defs //修改配置文件
----------------------------
PASS_MAX_DAYS 30 //将密码最大有效期修改为30天
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
[root@localhost ~]# useradd lucy //创建新用户lucy
[root@localhost ~]# grep "lucy" /etc/shadow
lucy:!!:19056:0:30:7::: //密码有效期默认30天
1.2.1 对于现有用户——chage命令
命令格式:
chage [选项] 用户名
选项:
-m:密码可更改的最小天数。为0时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-W:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:设置”最后一次修改密码的日期“。设置为 0 有特殊意思,表示用户应该在下次登录系统时更改密码。
-i:停滞时期。允许密码过期后多少天内仍能使用,如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。
示例:
1)chage -M ,设置用户密码的有效期。
[root@localhost ~]# chage -M 50 zhangsan //将zhangsan用户的密码有效期设置为50天
[root@localhost ~]# grep zhangsan /etc/shadow
zhangsan:!!:19030:0:50:7:::
[root@localhost ~]# chage -l zhangsan //查看当前设置
最近一次密码修改时间 :2月 07, 2022
密码过期时间 :3月 29, 2022
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :50
在密码过期之前警告的天数 :7
2)chage -d 0,强制要求用户下次登录时必须修改密码。
[root@localhost ~]# grep mike /etc/shadow
mike:!!:19056:0:30:7:::
[root@localhost ~]# chage -d 0 mike //强制要求用户下次登录时修改密码
[root@localhost ~]# grep mike /etc/shadow
mike:!!:0:0:30:7:::
[root@localhost ~]# chage -l mike
最近一次密码修改时间 :密码必须更改
密码过期时间 :密码必须更改
密码失效时间 :密码必须更改
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :30
在密码过期之前警告的天数 :7
1.3 命令历史限制
Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在 的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在 命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。 Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改/etc/profile 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设 置最多只记录 200 条历史命令。
一般使用两种方式控制命令历史:
- 减少记录的命令条数。
- 注销时自动清空命令历史,或登录时自动清空命令历史。
家目录下有 .bash_history 文件,用于记录历史命令。清空该文件即清空了命令历史。
命令:
1. 临时修改历史命令条数。只针对当前用户,退出登录后失效。
[root@localhost ~]# export HISTSIZE=200
2. 永久修改历史命令条数。编辑配置文件,设置历史命令条数。
[root@localhost ~]# vim /etc/profile //设置历史命令条数记录为200条
HISTSIZE=200
[root@localhost ~]# source /etc/profile //刷新配置文件,使文件立即生效
3. 注销时自动清空历史命令
[root@localhost ~]# vim ~/.bash_logout
echo "" > ~/.bash_history
4. 登录时自动清空历史命令
[root@localhost ~]# vim ~/.bashrc
echo "" > ~/.bash_history
示例:
1)临时修改历史命令条数。注销后失效。
2)永久修改历史命令条数。编辑/etc/profile 文件,设置命令记录为200条。
3)编辑 ~/.bash_logout 文件,在注销时清空命令历史。
4)编辑 ~/.bashrc 文件,在登录时清空命令历史。
注:
在注销时清空命令历史,或在登录时清空命令历史,设置其中一种即可。
1.4 终端自动注销
编辑/etc/profile 文件,设置闲置600秒后自动注销。
[root@localhost ~]# vi /etc/profile
.................................
export TMOUT=600
2 用户切换和提权
2.1 用户切换——su命令
2.1.1 用户切换——su 命令介绍
su命令即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令。
查看su操作记录:
系统安全日志/var/log/secure,是记录ssh登陆服务器的日志文件。
命令格式:
su [options...] [-] [user [args...]]
切换用户的方式:
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换。
su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换。
即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误(例如无法使用 service 命令)。
密码验证:
- root 切换到任意用户,不验证密码。
- 普通用户切换到其他用户,需要验证目标用户的密码。
注意:
su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。
[root@localhost ~]# su nancy //不加-,切换至nancy用户
[nancy@localhost root]$ pwd //不改变当前工作目录
/root
[nancy@localhost root]$ exit
exit
[root@localhost ~]# su - nancy //加 - 切换至nancy用户
上一次登录:一 3月 7 03:31:35 CST 2022pts/0 上
[nancy@localhost ~]$ pwd //会切换到自己的家目录
/home/nancy
[nancy@localhost ~]$ whoami //确定当前用户
nancy
普通用户切换到其他用户,需要验证目标用户的密码。
[nancy@localhost ~]$ whoami
nancy
[nancy@localhost ~]$ su - yuji
密码:
上一次登录:一 3月 7 03:41:41 CST 2022pts/0 上
2.1.2 限制使用su命令的用户
su 命令的安全隐患
- 默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。
- 为了加强su 命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su 命令进行切换。
限制使用su命令的用户(通过修改/etc/pam.d/su 文件):
- 将允许使用su命令的用户加入wheel组。
- 启用pam_wheel认证模块。则只有wheel组内的用户可以使用su命令切换用户。
查看 /etc/pam.d/su 文件:
注意第二行和第六行:
- 以上两行现在是默认状态(即开启第二行,注释第六行),这种状态下是允许所有用户间使用su命令进行切换的。
- 两行都注释是允许所有用户都能使用su命令,但root使用su切换到其他普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码)。
- 如果开启第六行,表示只有root用户和wheel组内的用户才可以使用su命令。
- 如果注释第二行,开启第六行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。
示例:
1)编辑 /etc/pam.d/su 文件,将第二行和第六行都开启,则只有root和wheel组内的用户才能使用 su 命令。
[root@localhost ~]# vim /etc/pam.d/su //开启第二行和第六行
.................................
2 auth sufficient pam_ rootok.so
6 auth required pam_ wheel.so use_ _uid
2)nancy用户不在wheel组内,使用su命令时拒绝权限。
[nancy@localhost ~]$ whoami //当前为nancy用户
nancy
[nancy@localhost ~]$ id nancy //查看nancy用户,不在wheel组内
uid=1006(nancy) gid=1007(nancy) 组=1007(nancy)
[nancy@localhost ~]$ su - yuji //su命令拒绝权限
密码:
su: 拒绝权限
3)将nancy用户加入wheel组内,则可以成功使用su 命令。
[root@localhost ~]# gpasswd -a nancy wheel //将nancy加入wheel组内
正在将用户“nancy”加入到“wheel”组中
[root@localhost ~]# su - nancy
上一次登录:一 3月 7 04:02:05 CST 2022pts/0 上
[nancy@localhost ~]$ whoami
nancy
[nancy@localhost ~]$ su - yuji //nancy成功使用su命令切换用户
密码:
上一次登录:一 3月 7 03:43:39 CST 2022pts/0 上
最后一次失败的登录:一 3月 7 04:02:34 CST 2022pts/0 上
最有一次成功登录后有 1 次失败的登录尝试。
2.2 用户提权——sudo命令
2.2.1 sudo命令和/etc/sudoers配置文件
sudo 即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。在最早之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。
sudo于1980年前后推出,sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、Mac OS X等。
查看sudo操作记录:
-
需要启用 Default logfile 配置
-
默认日志文件:/var/log/sudo.log
sudo特性:
- sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
- sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
- sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
- sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,权限必须为0440。
使用visudo命令,可编辑配置文件/etc/sudoers:
字段说明:
#用户 登入主机 = (代表用户) 命令
#user host=(username) command
root ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD:ALL
#root表示允许哪个用户。%wheel表示wheel组。
#第一个ALL表示通过哪些主机登入。
#第二个ALL表示以哪个用户身份。
#最后一个ALL表示允许运行哪些命令。
#NOPASSWD表示使用sudo命令不需要验证密码。
举例说明:
1.nancy ALL=(root) /bin/mount
#表示nancy用户通过任何主机登入系统后,可以以root的身份运行mount命令(命令前必须加sudo)。
2.%wheel ALL=(ALL) ALL
#表示wheel组内的成员通过任何主机登入系统后,可以以任何用户的身份运行所有命令(命令前必须加sudo)。
字段填写说明:
1.user:可以写用户名或UID。
2.group:可以写组名或GID。
3.host:可以写ip或hostname(IP地址或主机名)。
4.command:
command name (命令)
directory (文件夹里的命令)
sudoedit (可以编辑sudoers这个文件,变相变成管理员)
Cmnd_Alias (命令别名)
注:配置文件内支持使用通配符,例如"/sbin/*"表示/sbin/目录下的所有命令。
sudo基本语法:
sudo [-u username] [command] //-u:以哪个用户的身份运行命令
sudo -V //查看相关配置信息
示例:
1)允许 yuji 用户以任何用户的身份运行所有命令。
允许nancy用户以root用户的身份运行mount命令。
# 1.普通用户nancy不允许使用mount命令。
[nancy@localhost ~]$ whoami
nancy
[nancy@localhost ~]$ mount /dev/sr0 /mnt
mount: 只有 root 能执行该操作
# 2.编辑配置文件,将yuji用户和nancy用户加入文件。
[root@localhost ~]# visudo //编辑配置文件/etc/sudoers
---------------------------
yuji ALL=(ALL) ALL
nancy ALL=(root) /bin/mount
# 3.允许nancy用户以roo身份运行mount命令。
[nancy@localhost ~]$ whoami
nancy
[nancy@localhost ~]$ sudo mount /dev/sr0 /mnt
[sudo] nancy 的密码:
mount: /dev/sr0 写保护,将以只读方式挂载
# 4.yuji用户以root身份创建文件,文件属主是root。
[yuji@localhost ~]$ whoami
yuji
[yuji@localhost ~]$ sudo touch 1.txt
[sudo] yuji 的密码:
[yuji@localhost ~]$ ll 1.txt
-rw-r--r-- 1 root root 0 3月 7 16:52 1.txt
2)将jack用户加入wheel后,之后可使用所有命令。
1.jack不在/etc/sudoers文件中,不允许使用sudo命令。
[jack@localhost ~]$ sudo umount /mnt
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] jack 的密码:
jack 不在 sudoers 文件中。此事将被报告。
2.将jack加入wheel组内。jack可以成功使用sudo命令。
[root@localhost ~]# gpasswd -a jack wheel
正在将用户“jack”加入到“wheel”组中
[root@localhost ~]# su - jack
上一次登录:一 3月 7 16:45:31 CST 2022pts/0 上
[jack@localhost ~]$ whoami
jack
[jack@localhost ~]$ sudo umount /mnt
[sudo] jack 的密码:
[jack@localhost ~]$
2.2.2 sudo别名
sudo别名有四种类型:
- User_Alias(用户)
- Runas_Alias(代表用户)
- Host_Alias(登录主机)
- Cmnd_Alias(命令)
示例:
创建用户别名MYUSERS=lucy,mike。允许这两个用户使用/sbin/下的所有命令,除了reboot、poweroff、init、rm这四个命令。 (! 表示取反。! /sbin/reboot 表示不允许使用reboot命令。)
[root@localhost ~]# visudo
----------------------------------
User_Alias MYUSERS = lucy,mike
Host_Alias MYHOSTS = localhost
Cmnd_Alias MYCMNDS = /sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm
MYUSERS MYHOSTS=(root) NOPASSWD:MYCMNDS
注意:
如果配置文件内有语法错误,visudo命令会进行提示。
2.2.3 sudo子目录
如果对所有用户进行提权都放在/etc/sudoers 一个文件中,非常不便于管理。这时可以在/etc/sudoers.d/ 下创建子目录。例如针对 测试部门的员工进行授权,可以创建/etc/sudoers.d/test;针对hr部门的员工进行授权,可以创建/etc/sudoers.d/hr。便于分类管理。
[root@localhost ~]# vim /etc/sudoers.d/test //创建子目录
zhangsan ALL=(root) /bin/mount
[root@localhost ~]# chmod 440 /etc/sudoers.d/test //设置权限,加固安全
[root@localhost ~]# ll /etc/sudoers.d/test
-r--r----- 1 root root 33 3月 7 17:51 /etc/sudoers.d/test
注:
如果允许用户使用sudoedit命令,则该用户能够修改配置文件/etc/sudoers。变相变成管理员,十分危险,建议不要设置该命令。
[root@localhost sudoers.d]#vim /etc/sudoers.d/hr
lisi ALL=(root) sudoedit
[root@localhost ~]#su lisi
[lisi@localhost root]$ sudoedit /etc/sudoers //sudoedit可以修改配置文件,十分危险
2.2.4 查看sudo操作记录
-
需要启用 Default logfile 配置
-
默认日志文件:/var/log/sudo
[root@localhost log]# visudo //修改配置文件
-----------------------------
Default logfile="/var/log/sudo" //在最后一行添加 Default logfile 配置
测试查看日志是否正常记录:
[root@localhost ~]# sudo -u nancy touch /tmp/f2.txt //以nancy用户的身份创建文件
[root@localhost ~]# tail -4 /var/log/sudo //日志成功记录sudo操作
Mar 12 23:12:06 : root : TTY=pts/0 ; PWD=/root ; USER=nancy ; COMMAND=/bin/touch
/tmp/f1.txt
Mar 12 23:13:49 : root : TTY=pts/0 ; PWD=/root ; USER=nancy ; COMMAND=/bin/touch
/tmp/f2.txt
2.3 PAM安全认证
PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。
[root@localhost ~]#rpm -qi pam //查看当前系统pam
[root@localhost ~]#rpm -ql pam //查看模块
[root@localhost ~]#ls /usr/lib64/security/*.so|wc -l //60个模块是二进制文件,不会直接修改
60
[root@localhost ~]#ls /etc/security/ //和上面的模块配合使用,有些比较简单的模块没有配置文件
access.conf console.perms.d namespace.d sepermit.conf
chroot.conf group.conf namespace.init time.conf
console.apps limits.conf opasswd
console.handlers limits.d pam_env.conf
console.perms namespace.conf pwquality.conf
#我们去修改配置文件
/etc/security
/etc/pam.d/*
[root@localhost ~]#cd /etc/pam.d/ //这里的文件是应用程序怎么调用模块的
[root@localhost pam.d]#ls
atd login smtp
chfn other smtp.postfix
chsh passwd sshd
config-util password-auth sssd-shadowutils
crond password-auth-ac su
cups pluto sudo
fingerprint-auth polkit-1 sudo-i
fingerprint-auth-ac postlogin su-l
gdm-autologin postlogin-ac system-auth
gdm-fingerprint ppp system-auth-ac
gdm-launch-environment remote systemd-user
gdm-password runuser vlock
gdm-pin runuser-l vmtoolsd
gdm-smartcard setup vsftpd
ksu smartcard-auth xserver
liveinst smartcard-auth-ac
[root@localhost pam.d]#cat /etc/pam.d/sshd //文件类型
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
PAM提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录,如:telnet,rlogin,fsh,ftp,点对点协议PPP,su等应用程序中,系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。重复利用别人的开发的功能,不必自己开发,会话,密码验证等功能,已经做好了调用下就可以了未来通用性,所以有了pam框架。
2.3.1 PAM相关文件
- 包名: pam
- 模块文件目录:/lib64/security/*.so
- 特定模块相关的设置文件:/etc/security/
- 应用程序调用PAM模块的配置文件
- 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
- 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
- 注意:如/etc/pam.d存在,/etc/pam.conf将失效
2.3.2 PAM工作原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证。
PAM认证过程示例:
1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
专用配置文件/etc/pam.d/ 格式:
application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确
配置的其它服务
type:指模块类型,即功能
control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
module-path: 用来指明本模块对应的程序文件的路径名
Arguments: 用来传递给该模块的参数
配置文件/etc/pam.d/每一行都是一个独立的认证过程。
每一行可以区分为三个字段: 认证类型 、控制类型 、PAM 模块及其参数 。具体如下:
认证类型(module-type):
- 认证管理(authentication management):接受用户名和密码,进而对该用户的密码进行认证;
- 帐户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等;
- 密码管理(password management):用户修改密码时密码复杂度检查机制等功能;
- 会话管理(session management):主要是提供对会话的管理和记账。
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用。
控制类型: 也可以称做 Control Flags,用于 PAM 验证类型的返回结果。
- 1)required 验证失败时仍然继续,但返回 Fail。
- 2)requisite 验证失败则立即结束整个验证过程,返回 Fail 。
- 3)sufficient 验证成功则立即返回,不再继续,否则忽略结果并继续。
- 4)optional 不用于验证,只是显示信息(通常用于 session 类型)。
PAM 模块及其参数:
- 默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。
3 系统引导和登录控制
3.1 开关机安全控制
3.1.1 调整BIOS引导设置原则
-
将第一引导设备设为当前系统所在硬盘;
-
禁止从其他设备(光盘、 U盘、网络)引导启动系统;
-
将安全级别设为setup,并设置管理员密码。
禁用重启热键:Ctrl+Alt+Delete,避免因用户误操作重启。
3.1.2 GRUB限制
- 未经授权禁止修改启动参数
- 未经授权禁止进入指定系统
通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
3.1.3 GRUB菜单加密的实现
定义每个菜单项的所有脚本都存放在/etc/grub.d目录中,这些脚本的名称必须有两位的数字前缀,其目的是构建GRUB 2菜单时定义脚本的执行顺序以及相应菜单项的顺序,比如00_header文件首先被读取。
文件 | 描述 |
---|---|
00_header | 设置grub默认参数 |
10_linux | 系统中存在多个linux版本 |
20_ppc_terminfo | 设置tty控制台 |
30_os_prober | 设置其他分区中的系统(硬盘中有多个操作系统时设置) |
40_custom和41_custom | 用户自定义的配置 |
设置GRUB 2加密
由于GRUB 2负责引导linux系统,其作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。
在默认情况下,GRUB 2对所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB命令行。要启用认真支持,必须将环境变量超级用户设置为一组用户名(可以使用空格、逗号、分号作为分隔符)这样就只允许超级用户使用GRUB命令行、编辑菜单项以及执行任意菜单项。
GRUB 2密码支持以下两种格式:
- 明文密码:密码数据没有经过加密,安全性差。
- PBKDF2加密密码:密码经过PBKDF2哈希算法进行加密,在文件中存储的是加密后的密码数据,安全性较高。
为GRUB菜单设置密码的两种方式:
- CentOS 7系统中,直接使用 “grub2-setpasswd” 命令设置grub密码;
- CentOS 6系统中,先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,最后使用grub2-mkconfig命令生成grub配置文件。(/etc/grub.d/00_header是开机时第一个启动的文件)
方法一:
CentOS 7系统中,直接使用 “grub2-setpasswd” 命令设置grub密码。
[root@localhost ~]# grub2-setpassword //使用命令直接设置GRUB密码
Enter password: //输入密码
Confirm password: //确认密码
方法二:
CentOS 6系统中,
先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,
然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,
最后使用grub2-mkconfig命令生成grub配置文件。
# 步骤1.备份两个配置文件
[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
# 步骤2.生成PBKDF2加密口令
[root@localhost ~]# grub2-mkpasswd-pbkdf2 //使用哈希算法生成密码
输入口令:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.D9BDDD44312FD353436E03F2F73F643A0DD6FB59D989ECAAADB911E95846A477137A73DCEA248BFD6FF02BE2D52052E3790AEE175B10AA7634C6B66D1D9173C7.B15B5DC77367D1960086506C3E39A718477F1D326B6548577D992BB383DBA0E3AF7EFD3E67DD768E33B391C6AC1FAC1C6BB4CFF492D2046A651DF5986ACAE35A
# 步骤3.编辑配置文件/etc/grub.d/00_header,将加密口令添加进文件。注意复制口令时不要有空格。
[root@localhost ~]# vim /etc/grub.d/00_header
-------------------------------
cat <<EOF
set superusers="root" //设置登录用户
password_pbkdf2 root grub.pbkdf2.sha512.10000.D9BDDD44312FD353436E03F2F73F643A0DD6FB59D989ECAAADB911E95846A477137A73DCEA248BFD6FF02BE2D52052E3790AEE175B10AA7634C6B66D1D9173C7.B15B5DC77367D1960086506C3E39A718477F1D326B6548577D992BB383DBA0E3AF7EFD3E67DD768E33B391C6AC1FAC1C6BB4CFF492D2046A651DF5986ACAE35A
EOF
# 步骤4.使用 grub2-mkconfig 命令生成新的 grub.cfg 配置文件。
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-869778d6675742a5968d2ea8c0e087b2
Found initrd image: /boot/initramfs-0-rescue-869778d6675742a5968d2ea8c0e087b2.img
done
3.2 终端登录安全控制
3.2.1 限制root只在安全终端登录
安全终端配置:/etc/securetty
示例:
将终端tty5、tty6注释掉,禁止root用户从这两个终端登录。
[root@localhost ~]# vi /etc/securetty //编辑配置文件,将终端tty5、tty6注释掉
----------------------
#tty5
#tty6
3.2.2 禁止普通用户登录
- 建立/etc/nologin文件
- 删除nologin文件或者重启后即恢复正常
[root@localhost ~]# touch /etc/nologin //禁止普通用户登录
[root@localhost ~]# rm -rf /etc/nologin //取消普通用户登录限制
4 网络端口扫描——nmap工具
4.1 nmap工具
- 一款强大的网络端口扫描、安全、检测工具
- 官方网站:Nmap: the Network Mapper - Free Security Scanner
- CentOS 7.3光盘中安装包 nmap-6.40-7.el7.x86_64.rpm
网络端口扫描:
控制位 | 描述 |
---|---|
SYN | 建立链接 |
ACK | 确认 |
FIN | 结束断开 |
PSH | 传送 0 数据缓存,上层应用协议 |
RST | 重置 |
URG | 紧急 |
服务和端口号:
服务 | 端口号 |
---|---|
HTTP | 80 |
HTTPS | 443 |
Telnet | 23 |
FTP | 21 |
SSH(安全登录)、SCP(文件传输)、端口重定向 | 22 |
SMTP | 25 |
POP3 | 110 |
WebLogic | 7001 |
TOMCAT | 8080 |
WIN2003远程登录 | 3389 |
Oracle数据库 | 1521 |
MS SQL* SEVER数据库sever | 1433 |
MySQL 数据库sever | 3306 |
安装nmap:
[root@localhost ~]# rpm -qa|grep nmap //查看nmap
[root@localhost ~]# yum install -y nmap //安装nmap
nmap命令常用格式
nmap [扫描类型] [选项] <扫描目标>
常用选项和扫描类型
扫描类型和选项 | 作用 |
---|---|
-p | 指定扫描的端口。 |
-n | 禁用反向DNS解析(以加快扫描速度) |
-sS | TCP的SYN扫描 (半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。 |
-sT | TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。 |
-sF | TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对sYN数据包进行简单过滤,而忽略了其他形式的TCP攻击包。这种类型的扫描可间接检测防火墙的健壮性。 |
-sU | UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。 |
-sP | ICMP 扫描,类似于ping检测,快速判断目标主机是否存活,不做其他扫描。 |
-P0 | 跳过ping检测, 这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法ping通而放弃扫描。 |
用于主机发现的一些用法
- -sL:List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。
- -sn:Ping Scan 只进行主机发现,不进行端口扫描。
- -Pn:将所有指定的主机视作开启的,跳过主机发现的过程。
- -PS/PA/PU/PY[portlist]:使用TCPSYN/ACK或SCTP INIT/ECHO方式进行发现。
- -PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。
- -PO[protocollist]:使用IP协议包探测对方主机是否开启。
- -n/-R:-n表示不进行DNS解析;-R表示总是进行DNS解析。
- --dns-servers <serv1[,serv2],...>:指定DNS服务器。
- --system-dns:指定使用系统的DNS服务器。
- --traceroute::追踪每个路由节点。
Nmap用于端口扫描的一些用法
- -sS/sT/sA/sW/sM:指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描。
- -sU: 指定使用UDP扫描方式确定目标主机的UDP端口状况。
- -sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。
- --scanflags < flags>: 定制TCP包的flags。
- -sI < zombiehost[:probeport]>:指定使用idle scan方式来扫描目标主机(前提需要找到合适的zombie host)
- -sY/sZ: 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况。
- -sO: 使用IP protocol 扫描确定目标机支持的协议类型。
- -b < FTP relay host>: 使用FTP bounce scan扫描方式。
示例:
# 分别查看本机开放的TCP端口、UDP端口
[root@localhost ~]# nmap -sT 127.0.0.1
[root@localhost ~]# nmap -sU 127.0.0.1
# 检测192.168.80.0/24网段有哪些主机提供HTTP服务
[root@localhost ~]# nmap -p 80 192.168.80.0/24
[root@localhost ~]# nmap -p 80 192.168.91.100/24
# 检测192.168.80.0/24网段有哪些存活主机
[root@localhost ~]# nmap -n -sP 192.168.80.0/24
4.2 netstat命令
netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。
命令格式:
netstat [选项]
常用选项
选项 | 作用 |
---|---|
-a | 显示主机中所有活动的网络连接信息(包括监听、非监听状态的服务端口)。 |
-n | 拒绝显示别名,以数字的形式显示相关的主机地址、端口等信息。 |
-t | 查看TCP协议相关的信息。 |
-u | 显示UDP协议相关的信息。 |
-p | 显示与网络连接相关联的进程号、进程名称信息(该选项需要root权限) |
-r | 显示路由表信息。 |
-l | 显示处于监听状态(Listen)的网络连接及端口信息。 |
常用搭配:
netstat -a //列出所有端口
netstat -at //列出所有TCP端口
netstat -au //列出所有UDP端口
netstat -ax //列出所有unix端口
netstat -lt //列出处于监听状态的TCP端口
netstat -tnlp //直接使用ip地址列出所有处于监听状态的TCP端口,且加上程序名
示例:
1)netstat -lt,列出处于监听状态的TCP端口。
[root@localhost ~]# netstat -lt //列出处于监听状态的TCP端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 localhost.locald:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:shell 0.0.0.0:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 [::]:shell [::]:* LISTEN
2)netstat -tnlp,直接使用ip地址列出所有处于监听状态的TCP端口,且加上程序名。
[root@localhost ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1462/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1113/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1111/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1394/master
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 798/rsyslogd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 1113/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1111/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1394/master
tcp6 0 0 :::514 :::* LISTEN 798/rsyslogd