目录
[7. 终端自动注销](#7. 终端自动注销)
[1. su用户切换](#1. su用户切换)
[2. 使用sudo机制提升权限【☆】](#2. 使用sudo机制提升权限【☆】)
①john密码工具(官网www.openwall.com/john下载源码软件包)
[1. 对服务器做过哪些初始化操作?](#1. 对服务器做过哪些初始化操作?)
[2. 对服务器初始化后做过哪些安全加固?](#2. 对服务器初始化后做过哪些安全加固?)
一、账号安全管理
1.禁止用户登录
bash
usermod -s /sbin/nologin 用户名
2.锁定并且禁用长期不使用的用户
bash
passwd -l 用户名 #锁定用户
usermod -L 用户名 #锁定用户
passwd -s 用户名 #查看锁定状态
3.删除无效用户
bash
userdel -r 用户名
4.禁止账号和密码的修改
bash
chattr +i /etc/passwd /etc/shadow #锁定文件
chattr -i /etc/passwd /etc/shadow #解锁文件
lsattr 文件名 #查看文件锁定状态
5.密码安全
bash
chage -M 天数 用户名 #针对已存在的用户设置密码有效期
chage -d 0 用户名 #强制用户下一次登录修改密码
echo xxxxxx | passwd --stadin 用户名 #无交互修改密码
vim /etc/login.defs ---> 修改文件中PASS_MAX_DAYS 天数 #针对新建用户设置密码有效期
天数为99999表示永不过期,程序用户可以设为永不过期。
**补充:结合pam模块做ssh安全加固,远程登录时输入3次密码错误则锁定用户600秒,可以防止暴力破解密码(root用户同样限制)。在服务端服务器操作:**vim /etc/pam.d/sshd
第二行添加:
auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_unlock_time=600
补充:设置密码最小长度为8位,密码必须包含大小写字符与数字的策略
vim /etc/pam.d/system-auth
6.历史命令限制
bash
history #查看历史命令
history -c #临时清空当前环境的历史命令
①Linux系统默认1000条历史命令,如何修改历史命令数量?
第一步:vim /etc/profile --->改写原来HISTSIZE的值,或写入export HISTSIZE=n #export表示全局变量,在所有shell环境中都有效
第二步:source /etc/profile 等于**. /etc/profile** #加载,立即生效
echo $HISTSIZE #可查看历史命令数量
②如何设置所有用户登录时清空所有历史命令?
vim /etc/profile ---> 写入echo > ~/.bash.history #echo省略效果一样
或vim ~/.bashrc ---> 写入echo > ~/.bash_history
7. 终端自动注销
第一步:vim /etc/profile ---> 写入export TMOUT= n #表示n秒钟没有操作,窗口自动退出。
第二步:source /etc/profile 等于./etc/profile #立即生效
二、用户切换与提权
1. su用户切换
限制普通用户使用su切换用户
1.将允许使用su命令的用户加入wheel组:gpasswd wheel -a 用户名,表示为把信任的用户加入wheel组(wheel组是系统默认存在的一个组);
2.修改su的PAM认证配置文件,vim /etc/pam.d/su --->第二行 sufficient pam_rootok.so表示root使用su切换任何用户无密码认证,一般默认都是开启的;第六行pam_wheel认证模块取消注释 auth required pam_wheel.so use_uid 表示只有加入wheel组中其他用户才能执行su命令(#auto 表示不启用,auto表示启用)
PAM认证原理(理解)
ls /etc/pam.d | grep <程序名>
#查看某个程序是否支持PAM模块认证,配置文件为 /etc/pam.d/<程序名>
第一列表示pam认证模块的类型
- auth为认证模块、account为账户模块,passwd为密码模块,session为会话模块;
第二列表示pam控制标记
- required表示该模块必须认证通过整个认证才算成功,但这个模块认证失败不会立刻反馈结果,等所有模块都认证完才会提示。
- requisite表示该模块必须认证通过整个认证才算成功,认证失败会立刻反馈失败结果。
- sufficient表示该模块认证成功,且之前的required模块也认证成功则不需要继续验证其他模块。如果认证失败,则继续验证下面的模块,只要后面的模块认证通过也能通过。
- include表示引用其他模块的配置
第三列表示pam模块
第四列表示pam模块参数
|------|------------|-----|---------|---------|---------|---------|
| ||| 用户1 | 用户2 | 用户3 | 用户4 |
| auth | required | 模块一 | pass | fail | pass | pass |
| auth | sufficient | 模块二 | pass | pass | fail | pass |
| auth | required | 模块三 | pass | pass | pass | fail |
| 结果 ||| pass | fail | pass | pass |
[pam实例]
2. 使用sudo机制提升权限【☆】
用途
- sudo命令是给普通用户做提权的
添加可以授权给普通用户的命令
- visudo添加命令,root用户可以直接wq保存退出;
- vim /etc/sudoers添加命令,效果与visudo一样。但此文件root没有写的权限,需要wq!强制保存)
用法
- sudo 授权命令
vim /etc/sudoers配置格式
用户名 主机名=程序列表 或 ++组名 主机名=程序列表++
①zhangsan ALL=/sbin/*,/bin/*, !/sbin/reboot
等于:zhangsan ALL=(root) /sbin/*,/bin/*, !/sbin/reboot
都表示为zhangsan除了reboot命令,sbin和bin目录的所有命令都能以root用户身份执行。
②%XX组 ALL=/sbin/*
表示XX组中的用户能够执行sbin目录下的所有命令
③别名设置
用户别名:User_Alias 自定义=用户1,用户2...
主机别名:Host_Alias 自定义=主机名1,主机名2...
命令别名:Cmnd _Alias 自定义=命令路径1,命令路径2...
用户别名 主机别名=命令别名
三、系统安全控制
1.开关机安全控制
还记得root密码忘记找回密码的方法中有一种在开机grub加载时按e键进入修改,意味着谁都可以更改,root密码,风险很大。想要避免可以修改gurb配置,添加密码验证。
第一步:设置进入gurb引导设置需要的密码,并生成密钥
bash
grub-mkpasswd-pbkdf2
第二步:在/etc/grub.d/00_header中添加配置
bash
vim /etc/gurb.d/00_header
在最后添加以下内容:
cat << EOF
set superusers="admin"
passwd_pbkdf2 admin [密钥]
EOF
第三步:备份/boot/grub2/grub.cfg后重新生成一个配置文件
bash
/boot/grub2/grub.cfg #备份
grub2-mkconfig -o /boot/grub2/grub.cfg #重新生成配置文件
2.终端安全控制
①限制root只在安全终端登录
bash
vim /etc/securetty #默认开启,加#为关闭
②禁止所有普通用户登录
bash
touch /etc/nologin #创建后所有普通用户都无法登陆
重启或者删掉/etc/nologin文件即可取消禁止
③禁止单个普通用户登录
passwd -l 指定用户
usermod -L 指定用户
usermod -s /sbin/nologin 指定用户
pkill -9 -u 指定用户
3.系统弱口令检测
1)网络端口扫描NMAP
nmap命令可以扫描哪些主机开启了什么端口,可以用来进行加固或攻击,使用yum本地源或在线源都可以直接安装。
|------|-----|-----------------------------------------|-------------------------------|
| nmap | 选项 | 格式 | 说明 |
| nmap | -p | nmap -p ++80++ ++192.168.170.0/24++ | 检测目标网段有哪些主机使用HTTP80端口并显示端口状态 |
| nmap | -p | nmap -p ++1-80++ | 检测目标网段有哪些主机使用HTTP80端口并显示端口状态 |
| nmap | -p | nmap -p ++80,3389,22,21++ | 检测目标网段有哪些主机使用HTTP80端口并显示端口状态 |
| nmap | -sP | nmap -n -sP ++192.168.170.0/24++ | 快速扫描目标网段有哪些主机开启哪些端口,不做DNS反向查询 |
| nmap | -sT | nmap -sT ++127.0.0.1++ | 查看指定IP开放的TCP端口 |
| nmap | -sU | nmap -sU ++127.0.0.1++ | 查看指定IP开放的UDP端口 |
| nmap | -sF | nmap -sF ++127.0.0.1++ | 通过FIN探测扫描 |
| nmap | -sS | nmap -sS ++127.0.0.1++ | 通过SYN半连接扫描 |
| nmap |
| nmap |
| nmap |
| nmap |
| nmap |
|---------|-------|-------------------------------------------|
| netstat | -natp | 以数字形式查看正在运行的使用TCP协议的网络状态信息,包含相关联的进程号、进程名称 |
| netstat | -naup | 以数字形式查看正在运行的UDP协议的网络状态信息,包含相关联的进程号、进程名称 |
| netstat | -r | 显示路由表信息 |
| netstat | -l | 显示处于监听状态的网络连接及端口信息 |
如何查看某个进程是否已经开启?
①systemctl通过进程名查看进程状态和进程号
systemctl status ++httpd++
②ps通过进程名或端口号过滤查看进程状态信息
ps -elf | grep ++httpd++
ps aux | grep ++httpd++ 或++:80++
③netstat通过进程名或端口号过滤查看进程状态信息
netstat -lntup | grep ++httpd++ 或 ++:80++
④ss通过进程名或端口号过滤查看进程状态信息,用法和netstat一样,但是更详细更全面
ss -lntup | grep ++httpd++ 或 ++:80++
lsof -i ++:80++
如何通过端口号查看进程号?
netstat -lntup grep :端口号
ss -lntup | grep :端口号
lsof -i :80 #查看端口进程状态
2)密码工具破解密码
①john密码工具(官网www.openwall.com/john下载源码软件包)
第一步:上传软件包到/opt目录下并解压,切换到/opt/john-1.8.0/src/目录,在src目录下,make clean进行编译安装,我当前的系统类型为linux-x86-64,然后run目录自动生成名为john的二进制文件。make clean安装后会自动在run目录下生成程序文件和密码文件,密码文件可自己补充。
bash
make clean linux-x86-64
第二步:进入/opt/john-1.8.0/run目录下,复制当前系统中/etc/shadow文件到run目录下,并保存为shadow。执行JR破解并查看结果(破解密码是根据字典内容进行破解的,字典内没有的字段,破解不出来)
bash
cp /etc/shadow /opt/john-1.8.0/run/shadow #复制密码文件
./john shadow --wordlist=./password.list #执行john,根据密码词典破解密码
./john shadow --show shadow #查看破解后的shadow密码文件(包含密码)
补充:JR破解到的密码信息保存在/opt/john-1.8.0/run/john.pot文件中
②hydra密码工具(可yum安装)
第一步:使用在线yum源安装epel扩展源、安装hydra程序
bash
yum install -y epel-release #安装扩展源
yum install -y hydra #安装hydra
第二步:准备用户文件和密码文件,准备爆破
第三步:爆破
四、服务器初始化操作
当拿到一台新的服务器,需要对度武器做初始化才能用于生产。
1. 对服务器做过哪些初始化操作?
①重装操作系统(操作系统最小化安装的好处是体积小,软件少,以为着可攻击的面小。)
②设置网络:比如网卡IP、网关、路由、DNS服务器地址、物理机会做双网卡绑定(物理机会用两张网卡绑定,或者做组备,mode做负载均衡,需要有交换机做端口聚合来支持。加载bonding模块,双网卡绑定-bond)
③设置主机名、语言、字符集:hostnamectl set-hostname主机名
④ntp时间同步 ntpd chronyd ntpdare
⑤防火墙selinux 设置iptables或firewalld防火墙规则,关闭selinux功能 setenforce 0 vim/etc/selinux/config
⑥设置yum仓库镜像源 /etc/yum.repos.d/
⑦磁盘使用lvm或raid做磁盘管理
⑧精简开机启动服务:systemctl enable/disable crond rsrslog network sshd
⑨升级内核到新版本:集群升级内核yum install -y kernel-lt kernel-lt-devel
2. 对服务器初始化后做过哪些安全加固?
①禁止root用户远程登录 /etc/ssh/ssh_config --->PermitRootLogin no
②修改连接公网的ssh端口号 /etc/ssh/ssh_config --->port
③限制普通用户限制su切换用户
④普通用户使用t通过sudo授权管理 visudo /etc/sudoers
⑤锁定关键的系统文件 chattr +i,比如 /etc/shadow
⑥设置历史命令保存条数 /etc/profile ---> HISTSIZE
⑦设置账户超时时间 /etc/profile ---> TMOUT
⑧限制用户登录次数防止爆破 /etc/pam.d/sshd
⑨设置用户密码强度 /etc/pam.d/system-auth
⑩接入堡垒机或跳板机(一般服务器置于内网环境中,通过VPN做网络穿透不安全,可以搭建堡垒机一头接外网一头接内网,堡垒机多个安全审查功能 jumpserver)
五、故障案例以及处理方法
1.CPU使用率一直处于高峰值,怎么排查?
①top命令或者free -m先分析CPU内存指标,第三行能看到CPU的总的使用率(或者还可以用htop查看,更直观)②确定占用高的进程ID以及执行的命令 ③perf top -p PID,分析进程里是哪些系统调用、调用共享库、哪些模块造成该进程CPU占用过高(top -H PID 查看线程CPU使用情况)④第一种情况:访问量少但占用CPU多,可能是存在一些无限循环bug、Java不停的GC,找开发解决;业务量大导致的,解决办法即增加硬件配置或组件服务器集群。
2.硬盘读写慢,如何排查?
第一步:top命令查看硬盘是否繁忙,其中第三行"wa"表示iowait,值比较大表示硬盘繁忙,硬盘正有大量读写操作(0.1、0.2、0.3这种都还在正常范围,大于1就需要关注了)
第二步:iotop命令查看是哪些占用带宽高的进程,进一步可通过lsof命令查看占用带宽高的几个进程在进行什么操作会产生这么高的磁盘IO操作
第三步:lsof -p PID指定查看该进程打开了什么文件,显示文件描述符,从而排查出该进程到底哪个文件持续在读写,大量占用磁盘的写操作。
第四步:通过badblocks命令检查硬盘是否存在坏道,如果有坏道可以尝试修复或者更换硬盘
3.如何搭建堡垒机------jumpserver
堡垒机是一个资源集中管理的平台,相比跳板机它更加安全,且可以快速定位责任人。
第一步:官网复制安装脚本在系统中安装jumpserver
第二步:访问官网,默认账户admin,基础设置:设置密码,添加资产、添加用户、全部资产授权给admin、资产授权给其他用户、用户登录设置、命令管理。
第三步:工作台可进行文件管理、执行历史等操作,需要设置一下web终端(相当于本地终端直接登录服务器)。如果只加了website但没有在系统中维护远程应用的话,在这一步内部系统还是无法操作的。
第四步:远程应用建议使用Windowsserver2016或2019操作系统。远程应用创建应用发布机,IP选择一个Windows服务器的IP,添加账号,设置创建账号数量池,Core服务地址可以填写局域网IP或公网IP。创建成功后点击发布机部署,初始化部署。回到上一步中的内部系统,就可以访问内网地址了。
4.15秒修复系统启动故障
根据开机报错提示,找到挂载失败的分区。vim /etc/fstab文件,不让系统在开机时自动挂载出错的分区。如果解决不了,对于一些简单的逻辑损坏那就使用修复命令,ext4文件系统可以通过fsck.ext4 -a /dev/sda2,xfs文件系统可以通过xfs_repair -v -L /dev/sda1进行修复。