摘自2017 年部分文档
运维习惯
1.1 不使用root账户登录
1.2 不用rm –rf 可以用mv代替,把删除文件移动到 /tmp 目录下 写个定时计划清理缓存。或者用脚本替换到rm 为mv 增加回收站的功能
1 | alias rm='trash' |
2 | alias rl='trashlist' |
3 | alias ur='undelfile' |
4 | #替换rm指令移动文件到~/.trash/中 |
5 | trash() |
6 | { |
7 | mv $@ ~/.trash/ |
8 | } |
9 | #显示回收站中垃圾清单 |
10 | trashlist() |
11 | { |
12 | echo -e "33[32m==== Garbage Lists in ~/.trash/ ====33[0m" |
13 | echo -e "\a33[33m----Usage------33[0m" |
14 | echo -e "\a33[33m-1- Use 'cleartrash' to clear all garbages in ~/.trash!!!33[0m" |
15 | echo -e "\a33[33m-2- Use 'ur' to mv the file in garbages to current dir!!!33[0m" |
16 | ls -al ~/.trash |
17 | } |
18 | #找回回收站相应文件 |
19 | undelfile() |
20 | { |
21 | mv -i ~/.trash/$@ ./ |
22 | } |
23 | #清空回收站 |
24 | cleartrash() |
25 | { |
26 | echo -ne "\a33[33m!!!Clear all garbages in ~/.trash, Sure?[y/n]33[0m" |
27 | read confirm |
28 | if [ $confirm == 'y' -o $confirm == 'Y' ] ;then |
29 | /bin/rm -rf ~/.trash/* |
30 | /bin/rm -rf ~/.trash/.* 2>/dev/null |
31 | fi |
32 | } |
1.3 生产环境中所有操作都要求记录,并且已经实践过
1.4 密码定期更改(90天)建议使用证书登录并且有密码验证
1.5 账号密码需要纸质材料保管
1.6 设置定期更新系统,关注漏洞信息
1.7 遵循最小化原则,系统最小化,应用最小化,操作最小化,能不开的端口绝对不开
1.8 定期对系统和应用进行检查和扫描
1.9 经常关注新技术,并且不断学习
1.10 时刻保证充沛的精力,利用小时间休息
1.11 运维安全不分家,时刻关注最新漏洞情况
1.12 一定要有开发能力,运维不是为了逃避开发,是因为喜欢这份工作
系统
打开aclfile支持
安装acl 支持 yum -y install libacl acl
1 | vi /etc/fstab |
1 | dumpe2fs /dev/sda1 |grep acl |
不推荐使用lvm分区格式(建议测试环境使用)
设置系统自动注销
1 | vi /etc/profile |
2 | export TMOUT=600 |
精简开机(*按需定制)
acpid
apmd
kudzu
sshd
rsyslog
network
crond
sysstat
iostat
mpstat
sar
开启iptables
启用tcp_wrappers防火墙
减少不必要的用户
可以删除的用户 adm lp sync shutdown halt news uucp operator games gopher
可以删除的用户组 adm lp news uucp games dip pppusers popusers slipusers
为grub加密
隐藏linux 版本信息
锁定关键文件
选择合适的yum源
调整linux 系统文件描述符数量
临时修改
ulimit -n 4096
vim /etc/security/limits.conf
1 | 在这个文件的最后增加: |
2 | |
3 | * - nofile 4096 |
4 | |
5 | * - nofile 4096 |
Linux操作日志记录
1 | USER_IP=`who -u am i 2> /dev/null | awk '{ print $NF }' |sed -e 's/[()]//g'` |
2 | HISTDIR=/usr/share/.history |
3 | if [ -z $USER_IP ] |
4 | then |
5 | USER_IP=`hostname` |
6 | fi |
7 | if [ ! -d $HISTDIR ] |
8 | then |
9 | mkdir -p $HISTDIR |
10 | chmod 777 $HISTDIR |
11 | fi |
12 | if [ ! -d $HISTDIR/${LOGNAME} ] |
13 | then |
14 | mkdir -p $HISTDIR/${LOGNAME} |
15 | chmod 700 $HISTDIR/${LOGNAME} |
16 | fi |
17 | export HISTFILE=400000 |
18 | DT=`date +%Y%m%d` |
19 | export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT" |
20 | export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]" |
21 | chmod 777 $HISTDIR/${LOGNAME}/*.history* 2> /dev/null |
22 | chattr +a $HISTDIR/${LOGNAME}/*.history* 2> /dev/null |
更改权限chmod 1777 /usr/share/.history
禁止root远程登录更改常用端口
Selinux 调整
内核参数优化
/tmp /var/tmp /dev/shm目录没有执行权限
用户管理
用户账户
pwck (passwd check)
1.功能
检测/etc/passwd 的语法与文件及存在的用户
grpck (group check)
功能
检测/etc/group 的语法与文件形式及存在的用户组。
chage
功能查看密码用户过期时间
chage -l user
修改
user用户的密码期限:
上面的命令将密码期限设为2016年10月30日。另外,修改密码的最短周期为5天,最长周期为90天。密码过期前14天会发送消息提醒用户,过期后帐号会被锁住30天。
2.1.4查看空密码用户
1 | awk -F : '$2=="" {print $1}' /etc/shadow |
1 | awk -F: 'length($2)==2 {print $1}' /etc/shadow |
在centos等系统下,密码如果为空,会用两个!!表示,因此其长度为2,而正常的用户且密码不为空的,是采用加密存储的,其长度远大于2。
空密码用户建立过程
首先创建两个用户, 目的是为了比对
useradd user
useradd user1
然后root用户用passwd –d user (清除use1的密码)
查找uid为0的用户
1 | awk -F: '$3==0 {print $1}' /etc/passwd |
用户账户策略
2.2.1 设置账户过期时间
usermod -e MM/DD/YY username
usermod -e 12/31/01 floatboat
2.2.2 密码安全策略
需要安装(yum install cracklib-devel)( sudo apt-get install libpam-cracklib)
https://linux.cn/article-2518-1.html
⑴ 禁止使用旧密码
已经使用过的密码保存到/etc/security/opasswd下
⑵设置密码的最小长度
sudo vi /etc/pam.d/system-auth
1 | password sufficient pamunix.so sha512 shadow nullok tryfirstpass useauthtok remember= 5 minlen=最小长度 |
第二种方法
vi /etc/login.defs
vi /etc/login.defs 把 PASS_MIN_LNE 5
改为: PASS_MIN_LEN 想要的位数 [3]密码生存周期限制 vi /etc/login.defs PASS_MAX_DAYS=想要的天数 [4]口令过期提醒: vi /etc/login.defs 加入: PASS_WARN_AGE=天数
登录超时
编辑 /etc/profile 指令:sudo vi /etc/profile 在histsize=1000 下面加一行 TMOUT=100(单位为秒)
㈢使用pam禁止用户su为root
vi /etc/pam.d/su 打开这个配置文件 #auth required /lib/security/$ISA/pam_wheel.so use_uid ←找到此行,去掉行首的“#” 然后普通用户就无法通过su 得到root权限了
将在root用户下用指令 usermod
-G wheel user普通用户加入到wheel之后才能用su -提升到 root
sudo 限制权限
禁止某些用户使用**ssh**远程登录:
http://www.myhack58.com/Article/48/66/2011/30887.htm
vim /etc/pam.d/sshd
在第一行加入 auth required pam_listfile.so item=user sense=deny file=/etc/sshdusers onerr=succeed,注意一定要在第一行,因为pam中执行顺序是上面优先
vim /etc/sshdusers
在文件中加入root wp ,root 和wp是两个本地用户
service sshd restart
1 | cat /etc/passwd | awk -F ':' '{print $1}' > /etc/sshdusers |
2 | 去掉你想要的 |
如果只允许登录
auth required pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=fail
这个只允许某个登录
1 | echo 'user-admin' > /etc/sshdusers |
2 | chattr +i /etc/sshdusers |
限制root用户,ssh远程更改ssh端口
vi /etc/ssh/sshd_config
StrictModes yes #修改为yes,默认为yes.如果不修改用key登陆是出现server refused our key(如果StrictModes为yes必需保证存放公钥的文件夹的拥有与登陆用户名是相同的.“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。)
修改登录失败策略
以上表示10分钟闲置后,自动注销并结束会话。
检测方法 1、判定条件
查看帐号超时是否自动注销;
登录尝试5次失败锁定半小时
vim /etc/pam.d/login #本地锁定
auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=30
Vim /etc/pam.d/sshd #远程登录锁定
auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=30
查看用户登录失败次数:
pam_tally2 –user root
解除锁定:
pam_tally2 -r -u root
RSA认证
RSAAuthentication yes # 启用 RSA 认证(默认是注释掉的,将注释去掉,如果不是yes,改为yes)
PubkeyAuthentication yes # 启用公钥认证(默认是注释掉的,将注释去掉,如果不是yes,改为yes)
PasswordAuthentication yes # 密码认证(改为yes默认为yes是用密码认证)
生成认证证书
将生成的公钥匙id_rsa.pub传到要登陆的服务器上并追加到authorized_keys文件中,放到用户目录的.ssh中 cat id_rsa.pub >> .ssh/authorized_keys (如果没有authorized_keys,可直接将id_rsa.pub重命名为authorized_keys
保证.ssh 权限是600