系统安全对于任何一个组织和个人来说都非常重要。以下是几个重要的原因:
1.保护数据安全:现代信息技术已经成为组织和个人生产和运营的基础设施之一,
它们包含大量的机密和敏感信息,如客户数据、财务信息、知识产权等。
系统安全措施可以有效地保护这些数据不被恶意软件或黑客攻击盗取或破坏。
2.遵守法规要求:各种法规要求组织和个人必须采取措施保护其网络和系统的安全。
例如,根据欧盟 GDPR 法规,组织必须保证其处理的个人数据保持安全性。
3.避免系统崩溃:黑客攻击、病毒感染和恶意软件等安全事件可能导致系统崩溃和停机,
对于任何一个组织来说,系统停机都会对生产力和业务造成严重影响。
4.保护品牌形象:数据泄露、安全漏洞和系统攻击等事件会影响组织的声誉和品牌形象。
尤其是对于在线业务和金融机构等领域,品牌声誉和信誉是其业务的关键。
一.账号安全的基本措施
1.将非登录用户的Shell设为nologin
usermod -s nologin 用户名 #禁止登录
2.锁定长期不使用的账号(含解锁方式)
usermod -L lisi #锁定账户
usermod -U lisi #解锁账户
passwd -l lisi #锁定账户方
passwd -u lisi #解锁账户
3.删除无用的账号
userdel -r 用户名 #删除用户
4.chattr锁定重要文件(如passwd、shadow、fstab等)
lsattr /etc/passwd /etc/shadow #查看文件的状态
chattr +i /etc/passwd /etc/shadow #锁定文件
chattr -i /etc/passwd /etc/shadow #解锁文件
二.密码安全控制
对于新建用户,可以进入/etc/login.defs进行修改属性,设置密码规则,使得在下次创建用户时密码信息生效
设置密码有效期
要求用户下次登录时修改密码
1.适用于新建用户
vim /etc/login.defs #修改配置文件
第25行:
PASS_MAX_DAYS 30 #修改密码有效期为30天
2.适用于已有用户
chage -M 30 dn #修改密码有效期
3.强制在下次登录成功时修改密码(/etc/shadow第三个字段被修改为0)
chage -d 0 dn #设置下次登录强制修改密码
三.命令历史记录限制
减少记录的命令条数; vim /etc/profile 46:HISTSIZE=80
登录时自动清空命令历史;
系统默认保存1000条历史命令记录;
history -c 命令只可以临时清除记录,重启后记录还在。
1.临时修改当前用户的历史命令条数
export HISTSIZE=200
#临时修改历史命令条数为200条
[root@localhost ~]# echo $HISTSIZE
200
2.进入配置文件永久修改历史命令条数
vim /etc/profile
#进入配置文件
HISTSIZE=300
#将全局历史命令条数由1000改为300
source /etc/profile
#刷新配置文件,使文件立即生效
3.退出当前终端将命令清除
vim .bash_logout
echo " " > ~/.bash_history
source .bash_logout
4.开机后当前终端将命令清除
vim .bashrc
echo " " > ~/.bash_history
每次登录和退出都会清空历史记录
设置登录超时时间
vim /etc/profile
#进入配置文件
TMOUT=600
#设置全局自动注销时间,声明600s没有操作就登出
source /etc/profile
#更新配置文件
四.切换和限制用户
1.su:切换用户
可以切换用户身份,并且以指定用户的身份执行命令
1.1 切换用户的方式
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换
1.2 密码验证
超级管理员切换普通用户,不需要密码
普通用户切换普通用户,需要密码
普通用户切换超级管理员,需要密码
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,
否则会生成很多的bash子进程,环境可能会混乱。
1.3 限制使用su命令的用户
(1)su命令的安全隐患
默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,
带来安全风险
为了加强su命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su命令进行切换
-----------------------------------------------------------------------------------------------------
wheel 组
wheel 组是一个特殊的组,它通常被用于控制系统管理员(root)权限的访问。
具体来说,wheel 组可以被用来授权一些非特权用户访问一些只有管理员才能访问的系统命令或文件,
这些用户可以使用 sudo 命令以 root 用户身份执行这些命令或访问这些文件。
在默认情况下,只有 root 用户才能访问某些敏感文件或命令,
这样可以保证系统的安全性。
但是,在一些情况下,
管理员可能希望授权一些非特权用户执行特定的命令或访问某些文件,这时候就可以使用 wheel 组来实现。
默认情况下 wheel 组是没有任何成员的,管理员需要手动将用户添加到该组中,
并配置相应的 sudo 访问规则,
以授权这些用户执行特定的命令或访问特定的文件。
需要注意的是,在使用 wheel 组授权用户时,管理员应该仔细考虑授权的范围和权限,
以免不必要的安全风险。同时,管理员还应该遵循最小权限原则,
只授权用户执行必要的任务所需的最小权限,以减少系统遭受攻击的风险。
gpasswd -a 用户名 wheel 或者 sudo gpasswd -d 用户名 wheel
sudo vi /etc/group 在 wheel: x:10: 后添加用户名 , 以逗号分隔
----------------------------------------------------------------------------------------------------
(2)限制使用su命令的用户
将允许使用su命令的用户加入wheel组。
启用pam_wheel认证模块。则只有wheel组内的用户可以使用su命令切换用户(编辑/etc/pam.d/su文件)。
(3)查看su操作记录
安全日志:/var/log/secure
示例:有dn和ky32两个用户,要求设置dn可以使用su命令切换用户,ky27用户不允许使用
vim /etc/pam.d/su #编辑/etc/pam.d/su配置文件
auth required pam_wheel.so use_uid #将第六行的注释取消即可
gpasswd -a dn wheel #将希望可以使用su命令的用户加入到wheel组中
[root@localhost dn]# passwd -S dn #查询密码状态
dn PS 1969-12-31 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
dn:指定用户的用户名。
PS:用户密码的状态标识符。这里的 P 表示密码已经设置,且可用。
1969-12-31:密码最近一次修改的日期。这里表示密码没有被修改过
0:密码最短使用期限。这里的 0 表示没有限制。
99999:密码最长使用期限。这里的 99999 表示密码永不过期。
7:密码到期前的提醒天数。
-1:密码最后一次修改的日期。这里的日期与最近一次修改的日期相同,表示密码从未被修改过。
SHA512:密码的加密算法和加密方式。这里的 SHA512 crypt 表示使用 SHA512 算法进行加密。
[root@localhost dn]# su - dn
[dn@localhost ~]$ su - ky32
[ky27@localhost ~]$ su - dn
密码:
su: 拒绝权限
拒绝ky32用户使用su命令
----------------------------------------------------------------------------------------------------
PAM安全认证
PAM (Pluggable Authentication Modules) 是一种 Linux 系统下的身份认证框架,
它提供了一种标准的身份认证接口,允许系统管理员定制化地配置各种认证方式和方法。
PAM 具有高度的灵活性和可扩展性,允许管理员在登录过程中通过调用各种不同的认证模块,
实现不同的认证方式,如本地密码、Kerberos、LDAP、双因素认证等。
PAM 是一个可插拔式的认证模块
PAM 认证模块分为四个不同的类型:
认证模块:用于验证用户身份,例如基于密码的认证方式。
授权模块:用于控制用户对系统资源的访问权限,例如文件权限、进程权限等。
账户管理模块:用于管理用户账户信息,例如密码过期策略、账户锁定策略等。
会话管理模块:用于管理用户会话,例如记录用户会话信息、强制注销用户会话等。
PAM认证原理
PAM认证一般遵循的顺序: Service (服务) --> PAM (配置文件) --> pam_*.so;,
PAM认证首先要确定哪一项应用服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),
最后调用认证模块(位于/lib64/security/下)进行安全认证。
用户访问服务器的时候,服务器的某一个服务程序把用户的请求发送到PAM模块进行认证。
不同的应用程序所对应的PAM模块也是不同的。
如果想查看某个程序是否支持PAM认证,可以用ls命令进行查看/etc/pam.d/中的配置文件。
PAM的配置文件中的每一行都是一个独立的认证过程,
它们按从上往下的顺序依次由PAM模块调用。
PAM相关文件
ls /lib64/security/ 认证模块的位置
ls /etc/pam.d/ 配置文件位置
system-auth 是一个系统级别的认证配置文件,用于管理用户登录、密码验证和账号授权等方面的策略。
该文件位于 /etc/pam.d/ 目录下,
通常被用于配置 PAM(Pluggable Authentication Modules,可插拔认证模块)服务。
[root@localhost pam.d]# cat system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_fprintd.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
第一列:type类型 第二列:control控制位 第三列:PAM模块
type 类型
- auth 用户身份认证
- account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
- password 用户修改密码时密码复杂度检查机制等功能
- session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
Control: ( 控制位)
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,
失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,
再将失败结果返回给应用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,
将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,
但如果本模块返回失败可忽略,即为充分条件,优先于前面的
- equired和requisiteoptional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,
其返回值一般被忽略
include: 调用其他的配置文件中定义的配置
- optional 可选项
总结:
1)required 验证失败时仍然继续,但返回 Fail
2)requisite 验证失败则立即结束整个验证过程,返回 Fail
3)sufficient 验证成功则立即返回,不再继续,否则忽略结果并继续
4)optional 不用于验证,只是显示信息(通常用于 session 类型)
PAM模块(一共有61个任务模块)
默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。
同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,
这是由于每个模块针对不同的模块类型编制了不同的执行函数。
----------------------------------------------------------------------------------------------------
使用sudo机制提升权限
sudo命令的用途及用法
用途:以其他用户身份(如root)执行授权的命令
用法:sudo 授权命令
配置sudo授权
使用vim /etc/sudoers进行配置(此文件默认权限为440,保存时必须 wq!强制执行操作)
权限生效后,输入密码后5分钟可以不用重新输入密码
[root@localhost pam.d]# vim /etc/sudoers
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
使用命令的用户 主机列表=代表谁去执行命令 可以执行哪些命令
用户: 直接授权指定的用户名,或采用“&组名"的形式(授权一个组的所有用户)。
主机名:使用此规则的主机名。没配置过主机名时可用localhost,
有配过主机名则用实际的主机名,ALL则代表所有主机。
(用户):用户能够以何种身份来执行命令。此项可省略,缺省时以root用户的身份来运行命令。
命令程序列表:允许授权的用户通过sudo方式执行的特权命令,
需填写命令程序的完整路径,
多个命令之间以逗号“,"进行分隔。ALL则代表系统中的所有命令。
查看当前sudo配置文件,启用sudo操作日志
启用sudo操作日志
需启用Defaults logfile配置
默认日志文件:/var/log/sudo
操作:在/etc/sudoers末尾添加
Defaults logfile="/var/log/sudo"
示例1:配置文件使dn可以通过sudo命令使用ifconfig
第一步:切换至用户dn进行测试
[dn@localhost ~]$ ifconfig ens33:1 192.168.233.21/24
SIOCSIFADDR: 不允许的操作
SIOCSIFFLAGS: 不允许的操作
SIOCSIFNETMASK: 不允许的操作
[dn@localhost ~]$ sudo ifconfig ens33:1 192.168.168.12/24
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] dn 的密码:
提示要输入密码
第一步:vim /etc/sudoers
99和102行注释掉!!!
98 ## Allows people in group wheel to run all commands
99 #%wheel ALL=(ALL) ALL
100
101 ## Same thing without a password
102 # %wheel ALL=(ALL) NOPASSWD: ALL
第二步:在/etc/sudoers末尾插入相关配置,然后强制保存退出
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
93 dn ALL=(root) /sbin/ifconfig #配置文件
[root@localhost pam.d]# su - dn
上一次登录:日 2月 19 19:53:15 CST 2023pts/2 上
[root@localhost ~]# gpasswd -a dn wheel #必须添加到wheel组中才能直接生效。否则还会提示输密码
[dn@localhost ~]$ sudo ifconfig ens33:1 192.168.233.12/24 #直接生效,必须添加到wheel组中才能直接生效。
否则还会提示输密码
示例2:使用关键字来进行设置别名,批量控制用户
要求:控制用户进行sudo操作时无法使用重启(reboot)、关机(poweroff)、
切换init和无法删除
第一步:vim /etc/sudoers
98 ## Allows people in group wheel to run all commands
99 #%wheel ALL=(ALL) ALL #注释掉
在底行添加:
Host_Alias MYHOSTS = localhost #设置主机名
User_Alias MYUSERS = dn #设置限制的用户名
Cmnd_Alias MYCMNDS = /sbin*, !/sbin/reboot, !/sbin/poweroff, !/sbin/init, !/usr/bin/rm
#包含/sbin* 下的所有命令,但排除了 /sbin/reboot、/sbin/poweroff、/sbin/init
和 /usr/bin/rm
MYUSERS MYHOSTS=MYCMNDS
MYUSERS MYHOSTS=MYCMNDS: 这是授权的部分,它告诉系统,在主机 localhost 上,
用户 dn 可以运行 MYCMNDS 中定义的命令。
这个配置将允许用户 dn 在 localhost 主机上运行除了被排除的命令之外的任何 /sbin* 命令。
[dn@localhost ~]$ sudo reboot
[sudo] dn 的密码:
对不起,用户 dn 无权以 root 的身份在 localhost.localdomain 上执行 /sbin/reboot。
开关机安全控制
1.调整BIOS引导设置
将第一引导设备设为当前系统所在硬盘
禁止从其他设备(光盘、U盘、网络)引导系统
将安全级别设为setup,并设置管理员密码
grub加密方法(为GRUB菜单设置密码)
按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。
可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
第一步:按e键查看未设置之前的状态
重启之后按e,查看配置,不建议修改
第二步:设置GRUB密码并重启
[root@localhost ~]# grub2-setpassword
Enter password:
Confirm password:
[root@localhost ~]# reboot
在重启界面按e,输入账号密码才可以登录
4.终端登录安全控制
4.1 限制root只在安全终端登录
安全终端配置:/etc/securetty
tty1~ 6是文本型控制台,tty7 是X Window图形显示管理器。
可以通过CtrI+Alt+F1 (F1-F7键) 切换到对应的登录控制台。
示例:禁止root在tty2和tty3终端登录
第一步:更改安全终端配置文件
vim /etc/securetty
把tty2和tty3注释掉
禁止普通用户登录
建立/etc/nologin文件
删除nologin文件或者重启后即恢复正常
touch /etc/nologin
#禁止普通用户登录,只对图形化界面生效
rm -rf /etc/nologin
#取消上述登录限制,删除后即可恢复
系统弱口令检测工具:
john-1.8.0.tar.gz
cd /opt
tar -zxvf john-1.8.0.tar.gz #解压工具包
yum -y install gcc gcc-c++ make #安装软件编译工具
cd /opt/john-1.8.0/src
make clean linux-x86-64 #切换到src子目录,进行编译安装
cp /etc/shadow /opt/shadow.txt #准备待破解的密码文件
cd /opt/john-1.8.0/run
./john /opt/shadow.txt #切换到run子目录,执行暴力破解
./john --show /opt/shadow.txt #查看已破解出的账户列表
Linux 系统是目前应用最为广泛的服务器操作系统之一,其系统安全性关系到服务器的可靠性和数据安全。
以下是一些保护 Linux 系统安全的措施:
定期更新:及时更新系统内核和软件包,修补已知漏洞,以防止黑客利用漏洞攻击系统。
停用不必要的服务:禁用不必要的服务和端口,以减少攻击面。
配置防火墙:使用 iptables 或其他防火墙软件,限制入站和出站流量,防止未经授权的访问。
强化密码策略:使用复杂密码并限制密码长度和失效期限,避免使用弱密码和相同密码。
加强文件和目录权限:使用最小化的权限,限制用户访问敏感文件和目录,保护系统的关键信息。
启用 SELinux:安装并启用 SELinux,限制进程的访问权限,防止未经授权的访问和攻击。
安装杀毒软件:安装杀毒软件和防恶意软件软件,及时更新病毒库。
监控日志:启用系统日志,对系统的操作和安全事件进行监控和分析,及时发现和解决安全问题。
使用加密技术:使用加密技术对敏感数据进行保护,如 SSL/TLS 等。
定期备份:定期备份系统和数据,以应对突发事件,避免因为数据丢失或损坏而带来的风险和损失。
网络扫描—NMAP
一款强大的网络扫描、安全 检测工具
官方网站:Nmap: the Network Mapper - Free Security Scanner
CentOS 7.3光盘中安装包 nmap-6.40-7.el7.x86_64.rpm
nmap [扫描类型] [选项] <扫描目标>
netstat natp #查看正在运行的使用TCP协议的网络状态信息
netstat -natp | grep httpd #实际操作(httpd换成80也可以)
netstat -naup #查看正在运行的使用UDP协议的网络状态信息
nmap常见选项:
选项 功能
-p 指定扫描的端口。
-n 禁用反向DNS解析(以加快扫描速度) ip转换成 域名 12222 2www.baidu.com
-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通而放弃扫描。
5.1 安装nmap
[root@localhost yum.repos.d]# rpm -q nmap #检测是否安装
[root@localhost yum.repos.d]# yum -y install nmap
5.2 nmap -p 端口 网段 :指定扫描的端口
[root@localhost yum.repos.d]# nmap -p 80 192.168.233.0/24
5.3 nmap -n -sP:查看网段有哪些存活主机
[root@localhost yum.repos.d]# nmap -n -sP 192.168.233.0/24
5.4 查看本机开放的TCP端口、UDP端口
[root@localhost yum.repos.d]# nmap -sT 127.0.0.1
总结安全加固的措施
1.将非登录用户shell设置为nologin
2.锁定长期不使用的账号(锁定用户)
3.删除无用账号
4.chattr锁定配置文件(重要文件passwd、shadow、fstab等加 i 权限,不让删除)
5.设置密码复杂性规则(长度、特殊字符、失效时间等)密码策略
6.修改history,记录历史命令,尽量缩短记录历史命令的条数
7.禁止su root,切换超级管理员
8.设置sudo权限,禁用不安全命令
9.给GRUB设置密码
10.只允许BIOS从硬盘启动,关闭除了硬盘启动外的(光驱、udisk 、网络)
11.给BIOS设置密码
12.限制root只在安全终端登录
13.禁止普通用户登录
14.改掉大家都知道的服务端口
15.做好日志权限管理
16.内核参数调整