Linux 加固

摘自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

fstab

1
dumpe2fs /dev/sda1 |grep acl

dumpe2fs

不推荐使用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 的语法与文件及存在的用户

checkpasswd

grpck (group check)

功能

检测/etc/group 的语法与文件形式及存在的用户组。grpck

chage

功能查看密码用户过期时间

​ chage -l user

chage

修改
user用户的密码期限:

chage-1

chage-02

上面的命令将密码期限设为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。

nullpasswduser

空密码用户建立过程

首先创建两个用户, 目的是为了比对

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

⑴ 禁止使用旧密码

sys-auth

sys-auth-01

已经使用过的密码保存到/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权限了

stopsu

将在root用户下用指令 usermod
-G wheel user普通用户加入到wheel之后才能用su -提升到 root

denysu

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

changeport

denyroot

StrictModes yes #修改为yes,默认为yes.如果不修改用key登陆是出现server refused our key(如果StrictModes为yes必需保证存放公钥的文件夹的拥有与登陆用户名是相同的.“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。)

dontallownullpass

修改登录失败策略

trymax

nulltime

以上表示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

stopfive

Vim /etc/pam.d/sshd #远程登录锁定

auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=30

pamsshd

查看用户登录失败次数:

pam_tally2 –user root

解除锁定:

pam_tally2 -r -u root

RSA认证

RSAAuthentication yes # 启用 RSA 认证(默认是注释掉的,将注释去掉,如果不是yes,改为yes)
PubkeyAuthentication yes # 启用公钥认证(默认是注释掉的,将注释去掉,如果不是yes,改为yes)
PasswordAuthentication yes # 密码认证(改为yes默认为yes是用密码认证)

生成认证证书

identified

将生成的公钥匙id_rsa.pub传到要登陆的服务器上并追加到authorized_keys文件中,放到用户目录的.ssh中 cat id_rsa.pub >> .ssh/authorized_keys (如果没有authorized_keys,可直接将id_rsa.pub重命名为authorized_keys

保证.ssh 权限是600