1账号安全基本措施
1.1系统账号清理
- 将非登录用户的shell设为/sbin/nologin
- 设定长期不使用的账号
- 删除无用的账号
- 设定帐号文件passwd、shadow
1.1.1将用户设置为无法登录
[root@localhost~]# tail /etc/passwd //查看所有的用户信息
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
w:x:1000:1000:w:/home/w:/bin/bash
wu:x:1001:1001::/home/wu:/bin/bash
lisi:x:1002:1002::/home/lisi:/bin/bash
[root@localhost~]# chsh -s /sbin/nologin lisi //修改lisi的shell属性
Changing shell for lisi.
Shell changed.
[root@localhost~]# tail -1 /etc/passwd //查看lisi的属性
lisi:x:1002:1002::/home/lisi:/sbin/nologin
usermod -s /sbin/nologin //用户名 修改登录shell类型
1.1.2锁定用户:
[root@localhost~]# passwd -l lisi //锁定用户密码
锁定用户 lisi 的密码 。
passwd: 操作成功
[root@localhost~]# su lisi
[lisi@localhost root]$ su lisi
密码:
su: 鉴定故障
[root@localhost~]# passwd -u lisi //解锁用户密码
解锁用户 lisi 的密码。
passwd: 操作成功
[root@localhost~]# su lisi
[lisi@localhost root]$ su lisi
密码:
1.1.3删除用户
userdel -r 用户名
[root@localhost~]# userdel -r lisi
[root@localhost~]# su lisi
su: user lisi does not exist //su:用户 lisi 不存在
1.1.4锁定配置文件
chattr
-a 让文件或目录仅供附加用途。只能追加
-i 不得任意更动文件或目录。
[root@localhost~]# chattr +i /etc/passwd /etc/shadow
[root@localhost~]# useradd lisi
useradd:无法打开 /etc/passwd
[root@localhost~]# lsattr /etc/passwd /etc/shadow
----i----------- /etc/passwd
----i----------- /etc/shadow
chattr -i /etc/passwd /etc/shadow
1.2密码安全控制
1.2.1设置密码规则
对于新建用户
可以修改 /etc/login.defs 文件里的内容来设置密码规则
[root@localhost~]# vim /etc/login.defs
#适用于修改后生效后修改的用户
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
#############################################################
[root@localhost~]# tail -5 /etc/shadow //#修改密码有效期限
postfix:!!:19808::::::
sshd:!!:19808::::::
tcpdump:!!:19808::::::
w:$6$eUtWPb2HGGP0M3LZ$42FhB3KcZc3maHC10nwsp1Z/wgYl4rK1R.AX54I2qnDsHekj.jsj7s/1GIxDyOh0rFj.H8UJ5tDMQn2iw58EI1::0:99999:7:::
wu:!!:19814:0:99999:7:::
对于已有用户可以使用chage命令
chage
chage [选项] 用户名
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
[root@localhost ~]# chage -d 0 lisi #强制lisi下一次登录一定修改密码(密码符合复杂性要求) [root@localhost ~]#chage -M 30 lisi #设置密码有效期为30天 [root@localhost~]# cat /etc/shadow|tail -1 wu:!!:19814:0:99999:7:::
随机生成密码
cat /dev/random | tr -dc [[:alnum:]] |head -c 12
(tr -d 删除)
1.3命令历史
Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在 的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在 命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。
Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通 过修改/etc/profile 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设 置最多只记录 200 条历史命令。
#可以使用以下命令临时清除历史命令
history -c
clear[root@localhost~]# vim /etc/profile ................................................... export HISTSIZE=200 [root@localhost~]# . /etc/profile //source= . [root@localhost~]# echo $HISTSIZE 200
退出清空密码
注销时自动清空历史命令 [root@localhost ~]#vim .bash_logout #退出后清除 # ~/.bash_logout echo " " >~/.bash_history 登录时自动清空历史命令 #一定要加空格 [root@localhost ~]#vim .bashrc 自对自己生效 #开机后清除 echo " " >~/.bash_history
终端自动注销
编辑 /etc/profile 文件,设置闲置600秒后自动注销 (不常用)
设置超时时间
[root@localhost ~]# vi /etc/profile 对所有用户生效 ................................. export TMOUT=60 [root@localhost ~]# source /etc/profile
1.4PAM安全认证
PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API 接口,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。
1.4.1PAM相关文件
- 包名: pam
- 模块文件目录:/lib64/security/*.so
- 特定模块相关的设置文件:/etc/security/
- man 8 加模块名 可以查看帮助
- 应用程序调用PAM模块的配置文件
1. 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
2. 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
3. 注意:如/etc/pam.d存在,/etc/pam.conf将失效
1.4.2PAM工作原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证
1.4.3PAM安全认证流程
控制类型也称做Control Flags,用于PAM验证类型的返回结果
1.required验证失败时仍然继续,但返回Fail
2.requisite验证失败则立即结束整个验证过程,返回Fail
3.sufficient验证成功则立即返回,不再继续,否则忽略结果并继续
4.optional不用于验证,只显示信息(通常用于session类型)
认知过程示例
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回传的结果决定下一个动作(重新输入密码或者通过验证)
1.4.4专用配置文件/etc/pam.d/ 格式
type control module-path arguments
application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务
type:指模块类型,即功能
control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
module-path: 用来指明本模块对应的程序文件的路径名
Arguments: 用来传递给该模块的参数
模块类型(module-type)
- Auth 账号的认证和授权
- Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
- Password 用户修改密码时密码复杂度检查机制等功能
- Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
Control: ( 控制位)
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的
- equired和requisiteoptional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略include: 调用其他的配置文件中定义的配置
- optional 可选项
1.4.5shell模块
功能:检查有效shell
帮助:man pam_shells
案例:不允许使用/bin/csh的用户本地登录
模块: pam_shells.so 只允许 规定的shell类型通过,是在/etc/shells 文件中存在的 类型通过
[root@localhost ~]#vim /etc/pam.d/su
在第一行添加auth required pam_shells.so
[root@localhost~]# vim /etc/shells
去掉/bin/csh
[root@localhost~]# useradd -s /bin/csh zhangsan
因为zhangsan不在pam_shells.so规定的shell类型中所以无法进行切换用户
1.4.6securetty模块
功能:只允许root用户在/etc/securetty列出的安全终端上登陆
pam_nologin.so模块
功能:如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆
1.4.7limit
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
修改限制的实现方式:
(1) ulimit命令
ulimit是linux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。
ulimit的设定值是 per-process 的,也就是说,每个进程有自己的limits值。使用ulimit进行修改,立即生效。
ulimit只影响shell进程及其子进程,用户登出后失效。
可以在profile中加入ulimit的设置,变相的做到永久生效
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-u size:最大用户进程数
-v size:设置虚拟内存的最大值.单位:kbytes
unlimited 是一个特殊值,用于表示不限制
[root@localhost pam.d]#ulimit -a
#可以看到系统的相关 资源限制 设置
[root@localhost pam.d]#ulimit -n 10000
#修改最大值 临时修改
2.用户切换和提权
2.1切换用户
su命令即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
su [options...] [-] [user [args...]]
切换用户的方式:
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换
说明:root su至其他用户无须密码;非root用户切换时需要密码
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。
su 与 su-
即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误(例如无法使用 service 命令)。
限制使用su命令的用户
a)以上两行是默认状态(即开启第一行,注释第二行),这种状态下是允许所有用户间使用su命令进行切换的。[root@localhost~]# gpasswd -a lisi wheel 正在将用户“lisi”加入到“wheel”组中 [root@localhost~]# vim /etc/pam.d/su #%PAM-1.0 auth sufficient pam_rootok.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid # Uncomment the following line to require a user to be in the "wheel" group. #auth required pam_wheel.so use_uid auth substack system-auth auth include postlogin account sufficient pam_succeed_if.so uid = 0 use_uid quiet account include system-auth password include system-auth session include system-auth session include postlogin session optional pam_xauth.so
b)两行都注释也是允许所有用户都能使用su命令,但root'下使用su切换到其他普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码。)
c)如果开启第二行,表示只有root用户和wheel组内的用户才可以使用su命令
d)如果注释第一行,开启第二行,表示只有whee1组内的用户才能使用su命令,root用户也被禁用su命令。
2.2sudo用户提权
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特性:
- sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
- sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
- sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
- sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440
sudo组成:
- 包:sudo
- 配置文件:/etc/sudo.conf
- 执行授权命令:/usr/bin/sudo
- 时间戳文件:/var/db/sudo
- 日志文件:/var/log/secure
授权规则配置文件:
- /etc/sudoers 修改文件
- /etc/sudoers.d/*.conf 子配置
安全编辑授权规则文件和语法检查工具
/usr/sbin/visudo
visudo -c 检查语法
sudo授权规则配置
配置文件格式说明:/etc/sudoers, /etc/sudoers.d/
配置文件中支持使用通配符 glob
?任意单一字符
*匹配任意长度字符
[wxc] 匹配其中一个字符
[!wxc] 除了这三个字符的其它字符
\x 转义
[[alpha]]字母
示例:
[root@localhost:~# ]visudo
找到root并在其下面添加lisi的配置文件
虽然已经给lisi做了配置文件,但是还是没有权限
必须要安写好配置文件来
配置文件规则有两类
1、别名定义:不是必须的
2、授权规则:必须的
sudoers 授权规则格式:
用户登入主机=(代表用户)命令
user host=(runas)commanduser: 运行命令者的身份
host: 通过哪些主机 多个 192.168.91.100 - 110 localhost
(runas):以哪个用户的身份
command: 运行哪些命令
查看sudo操作记录
需要启用Defaults logfile 配置
默认日志文件:/var/log/sudo
[root@localhost ~]# visudo
Defaults logfile ="/var/log/sudo"
sudo别名有四种类型:
- User_Alias(用户)
- Runas_Alias(代表用户)
- Host_Alias(登录主机)
- Cmnd_Alias(命令)
别名格式:必须大写字母,数字可以使用但是不能放在开头
User和runas:
username(用户名)
#uid(id号)
%group_name(组名)
%#gid(组id)
user_alias|runas_alias(别名) MYUSER=zhangsan,lisi
host:
ip或hostname(IP地址或主机名)
host_alias(别名) localhost
command:
command name (命令)
directory (文件夹里的命令)
sudoedit (可以编辑sudoers这个文件,变相变成管理员)
Cmnd_Alias (命令别名)
例子:
Host_Alias MYHOSTS = kgc,localhost
User_Alias MYUSERS = zhangsan,wangwu,lisi
Cmnd_Alias MYCMNDS = /sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm
sudo子目录
如果对所有用户进行提权都放在/etc/sudoers 一个文件中,非常不便于管理。这时可以在/etc/sudoers.d/ 下创建子目录。
例子:
[root@localhost sudoers.d]#vim /etc/sudoers.d/test
lisi ALL=(root) sudoedit
[root@localhost ~]#su lisi
[lisi@localhost root]$ sudoedit /etc/sudoers
开关机安全控制
调整BIOS引导设置
- 将第一引导设备设为当前系统所在硬盘
- 禁止从其他设备(光盘、U盘、网络)引导系统
- 将安全级别设为setup,并设置管理员密码
GRUB限制
- 使用grub2-mkpasswd-pbkdf2生成密钥
- 修改/etc/grub.d/00 header文件中,添加密码记录
- 生成新的grub.cfg配置文件
grub 加密
/etc/grub.d目录
定义每个菜单项的所有脚本都存放在/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哈希算法进行加密,在文件中存储的是加密后的密码数据,安全性较高。
[root@localhost ~]#grub2-setpassword #直接设置密码