目录
一、账号安全控制
1. 系统账号清理
1.1 将用户设置为无法登录
1.2 锁定用户
1.3 删除用户
1.4 锁定配置文件
2. 密码安全控制
2.1 设置密码规则
3. 命令历史
4. 切换用户
4.1 su和su -
4.2 限制使用su命令的用户
5. PAM安全认证
5.1 概述
5.2 pam相关文件
5.3 pam工作原理
5.4 专用配置文件/etc/pam.d/ 格式
5.5 shell模块
5.6 securetty模块
5.7 pam_nologin.so 模块
5.8 limit
6. sudo
6.1 概述
6.2 特性
6.3 提权操作
6.4 别名
6.5 子目录
二、系统引导和登录控制
1. 开关机安全控制
1.1 调整 BIOS引导设置
1.2 禁止 Ctrl + Alt + Del 快捷键重启
1.3 grup加密
2. 禁止root用户登录
2.1 禁止通过ssh协议登录root
2.2 修改root用户shell类型
三、弱口令检测、端口扫描
1. 弱口令检测——John the Ripper
2. 网络扫描NMAP
shell——/sbin/nologin却比较特殊,所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源,如程序用户。
[root@localhost ~]# tail -1 /etc/passwd #查看fql的属性
fql:x:1000:1000:fql:/home/fql:/bin/bash
[root@localhost ~]# usermod -s /sbin/nologin fql
#修改fql的shell属性
#或者chsh -s /sbin/nologin fql也可以修改
[root@localhost ~]# tail -1 /etc/passwd
fql:x:1000:1000:fql:/home/fql:/sbin/nologin
[root@localhost ~]# su fql
This account is currently not available. #此帐户当前不可用
[root@localhost ~]# passwd -l fql
锁定用户 fql 的密码 。
passwd: 操作成功
[root@localhost ~]# usermod -L fql
[zhangsan@localhost root]$ su fql
密码:
su: 鉴定故障
[root@localhost ~]# userdel -r zhangsan #-r表是家目录
[root@localhost ~]# id zhangsan
id: zhangsan: no such user
chatter
[root@localhost ~]# chattr +i /etc/passwd #锁定文件
[root@localhost ~]# lsattr /etc/passwd #查看特殊权限
----i----------- /etc/passwd
[root@localhost ~]# useradd zhangsan
useradd:无法打开 /etc/passwd
[root@localhost ~]# chattr -i /etc/passwd #解锁
对于新建用户,可以修改/etc/login.defs文件里的内容来设置密码规则
[root@localhost ~]# vim /etc/login.defs
#######################################
PASS_MAX_DAYS 99999
#密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。
PASS_MIN_DAYS 0
#表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。
PASS_MIN_LEN 5
#指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
PASS_WARN_AGE 7
#指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。
对于已有用户可以使用chage命令
chage [选项] 用户名
[root@localhost ~]# chage -d 0 fql
#强制fql下一次登录一定修改密码(密码符合复杂性要求)
Shell 环境的命令历史机制有利有弊。当用户的历史命令操作过程输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。通 过修改/etc/profile 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。
[root@localhost ~]# history | wc -l #统计历史命令数
208
[root@localhost ~]# echo $HISTSIZE #最大1000历史命令条数
1000
[root@localhost ~]# history -c | wc -l #清除历史命令(临时)
0
[root@localhost ~]# vim /etc/profile #对所有用户生效
####################################
export HISTSIZE=200
#设置最多只记录200条历史命令,export设置环境变量,HISTSIZE历史命令记录条数
export TMOUT=60
#设置超时时间,用户闲置后注销
[root@localhost ~]# source /etc/profile #重新加载系统环境变量文件/etc/profile
[root@localhost ~]# vim .bashrc
###############################
echo " " > ~/.bash_history
#开机之前先运行:将空格重定向至.bash_history文件中,即清空,仅对当前用户生效
~/.bashrc,~/.bash_profile:开机之前先运行文件里的命令
~/.bash_logout:关机之前先运行文件里的命令
su命令即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令。su与su -,存在区别:su仅切换一部分,未切环境变量,这会导致某些命令运行出现问题或错误,如法使用service 命令;su -切的彻底,将使用目标用户的登录shell环境。超管切换普通用户不需要密码。
在pam模块中, 主要有pam_ rootok.so和pam_ wheel.so两个模块组合限制用户使用su命令。
[root@localhost ~]# vim /etc/pam.d/su
这里模拟第四种情况: 第一行注释、第二行开启
[root@localhost ~]# gpasswd -a fql wheel
正在将用户“fql”加入到“wheel”组中
[root@localhost ~]# vim /etc/pam.d/su
[root@localhost ~]# su zhangsan
密码:
su: 拒绝权限
[fql@localhost ~]$ su zhangsan
密码:
[zhangsan@localhost fql]$ #wheel组成员fql可以使用su命令
PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。PAM 只关注如何为服务验证用户的API,通过提供一些动态链接库和一套统一的API接口,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so;PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证。
当用户来访问某一程序的时候,如果这个启用了pam模块,会先去读取配置文件,然后按照配置文件调用模块进行操作。
control控制类型 :
主要功能是检查有效shell,pam_shells.so模块只允许规定的shell类型通过,使在/etc/shells 文件中存在的类型通过。
案例:不允许使用/bin/csh的用户本地登录(借用su模块添加相关配置)
[root@localhost ~]# usermod -s /bin/csh zhangsan #修改zhangsan用户shell类型
[root@localhost ~]# vim /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
#/bin/csh #去掉该类型
[root@localhost ~]# su zhangsan
密码:
su: 鉴定故障 #zhangsan无法登录
默认情况下centos是不允许用户使用telnet协议(密码明文传输,不安全)远程登录的,该模块功能为只允许root用户在/etc/securetty列出的安全终端上登陆
案例:CentOS 7允许root在telnet登陆
服务端
[root@localhost ~]# yum install -y telnet-server.x86_64 #安装telnet服务端
[root@localhost ~]# systemctl start telnet.socket #启动服务
[root@localhost ~]# vim /etc/pam.d/remote #修改pam模块配置
或者在/etc/securetty文件中加入
root
[root@localhost ~]# systemctl stop firewalld.service #关闭防火墙
[root@localhost ~]# setenforce 0
客户端
[root@localhost ~]# yum install -y telnet #安装telnet客户端
[root@localhost ~]# telnet 192.168.190.100 #通过telnet协议远程登录服务端
Trying 192.168.190.100...
Connected to 192.168.190.100.
Escape character is '^]'.
Kernel 3.10.0-1160.el7.x86_64 on an x86_64
localhost login: root
Password:
Last login: Sat Jan 6 15:47:48 from 192.168.190.1
[root@localhost ~]# #登录成功
如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆。可运用在维护场景下。默认此模块可以对ssh等登录有效,但不影响su登录。
[root@localhost ~]# touch /etc/nologin
[root@localhost ~]# echo "系统维护中" > /etc/nologin
[root@localhost ~]# su fql
[fql@localhost root]$
ulimit是linux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。 每个进程有自己的limits值,使用ulimit进行修改,立即生效。ulimit只影响shell进程及其子进程,用户登出后失效。可以在profile中加入ulimit的设置,变相的做到永久生效。其配置文件路径为/etc/security/limits.conf。
[root@localhost ~]# ulimit -a #可以看到系统的相关资源限制设置
案例:限制zhangsan用户最多可用打开三个进程,vim /etc/security/limits.conf
[root@localhost ~]# su - zhangsan
'abrt-cli status' timed out
[zhangsan@localhost ~]$ bash
bash: fork: retry: 没有子进程
bash: fork: retry: 没有子进程
[root@localhost ~]# pgrep -l -u zhangsan #显示zhangsan进程名
54852 bash
54887 bash
54888 bash
案例:修改tcp最大连接数
[root@localhost ~]# ulimit -n 2000 #设置内核可以同时打开的文件描述符的最大值
[root@localhost ~]# ab -c1025 -n5000 http://192.168.190.100/ #压测
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.190.100 (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
sudo即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。由于su root存在被暴力破解密码的风险,sudo使一般用户不需要知道超级用户的密码即可获得权限,提高了安全性。
visudo:推荐使用,自带语法检查功能
示例:
[root@localhost ~]# visudo
zhangsan ALL=(root) /usr/bin/mount /dev/sr0 /mnt/
[zhangsan@localhost ~]$ sudo mount /dev/sr0 /mnt/
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] zhangsan 的密码:
mount: /dev/sr0 写保护,将以只读方式挂载
格式: visudo
Host_Alias MYHOSTS = kgc,localhost
User_Alias MYUSERS = zhangsan,wangwu,lisi
Cmnd_Alias MYCMNDS = /sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm
[zhangsan@localhost ~]$ sudo mount /dev/sr0 /mnt
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] zhangsan 的密码:
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# ping pc2
ping: pc2: 未知的名称或服务
[root@localhost ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.190.101 pc2 #定义域名pc2
~
~
~
[root@localhost ~]# ping pc2
PING pc2 (192.168.190.101) 56(84) bytes of data.
64 bytes from pc2 (192.168.190.101): icmp_seq=1 ttl=64 time=1.21 ms
64 bytes from pc2 (192.168.190.101): icmp_seq=2 ttl=64 time=1.67 ms
子配置文件优先级大于主配置文件
[root@localhost ~]# vim /etc/sudoers.d/zhangsan #配置子配置文件
zhangsan ALL= NOPASSWD:ALL #允许zhangsan不需要密码做任何操作
[zhangsan@localhost ~]$ mount | tail -1
tmpfs on /run/user/1001 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=186708k,mode=700,uid=1001,gid=1001)
[zhangsan@localhost ~]$ sudo mount /dev/sr0 /mnt #普通用户可以根据子配置文件提权操作
mount: /dev/sr0 写保护,将以只读方式挂载
centos7中默认关闭,可以在/etc/inittab中查看
centos6中需要修改配置文件/etc/init/control-alt-delete.conf,注释后重启:
#start on control-alt-delete
#exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
由于GRUB 2负责引导linux系统,其作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。
[root@localhost ~]# grub2-setpassword #centos7可以直接设置密码
Enter password:
Confirm password:
通过上述配置,重新开机进入GRUB菜单时,直接按e键将无法修改引导参数若要获得编辑权限,必须先按p键并根据提示输入正确的GRUB密码。
[root@localhost ~]# vim /etc/ssh/sshd_config
[root@localhost ~]# usermod -s /sbin/nologin root
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# ls
john-1.8.0.tar.gz rh
[root@localhost opt]# tar xf john-1.8.0.tar.gz #解压工具包
[root@localhost opt]# cd john-1.8.0/
[root@localhost john-1.8.0]# ls
doc README run src
[root@localhost src]# cd run/
[root@localhost run]# ls
ascii.chr digits.chr john.conf lm_ascii.chr mailer makechr password.lst relbench
[root@localhost run]# yum install -y gcc gcc-c++ make #安装软件编译工具
[root@localhost run]# cd /opt/john-1.8.0/src #切换到src子目录
[root@localhost src]# make clean linux-x86-64 #进行编译安装
[root@localhost src]# cp /etc/shadow /opt/shadow.txt
[root@localhost src]# cd /opt/john-1.8.0/run
[root@localhost run]# ./john /opt/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
123 (fql)
123 (zhangsan)
123 (root)
[root@localhost ~]# yum install -y nmap
[root@localhost ~]# nmap -sT 127.0.0.1
[root@localhost ~]# nmap -sU 127.0.0.1
#分别查看本机开放的TCP端口、UDP端口
[root@localhost ~]# nmap -p 80 192.168.190.0/24
#检测192.168.190.0/24网段有哪些主机提供HTTP服务
[root@localhost ~]# nmap -n -sP 192.168.190.0/24
#检测192.168.190.0/24网段有哪些存活主机