linux系统加固
/etc/login.defs
定义了/etc/passws以及/etc/shadow配套的用户限制
一定要存在
,没有这个文件的时候,某些时候不会影响系统的使用,但有些时候会产生一些意想不到的问题
如果/etc/passws以及/etc/shadow与/etc/login.defs文件产生了冲突,系统会以/etc/passwd及/etc/shasow为准,/etc/passwd以及/etc/shadow在系统中优先级较高。
文件内容
grep -Ev "^#|^$" /etc/login.defs
MAIL_DIR /var/spool/mail # 用户发邮件的地址
PASS_MAX_DAYS 99999 # 密码最大有效期,以天位单位
PASS_MIN_DAYS 0 # 两次修改密码的最小间隔,以天为单位
PASS_MIN_LEN 5 # 密码最小长度 对root无效
PASS_WARN_AGE 7 # 密码过期前n天开始提示
UID_MIN 1000 # 用户ID,当你创建普通用户的时候,如果不指定UID 那么就会从1000递增
UID_MAX 60000 # 创建普通用户最大的ID, 65534
SYS_UID_MIN 201 # 不指定UID时,创建的系统用户最小UID
SYS_UID_MAX 999 # 不指定UID时,创建的系统用户最大UID
GID_MIN 1000 # 组ID,当你创建组的时候,如果不指定GID 那么就会从1000递增
GID_MAX 60000 # 创建组最大的ID, 65534
SYS_GID_MIN 201 # 不指定GID时,创建的系统用户最小GID
SYS_GID_MAX 999 # 不指定GID时,创建的系统用户最大GID
CREATE_HOME yes # 创建用户的时候,为这个用户创建相应的家目录
UMASK 077 # 用户的家目录的权限值 7000
USERGROUP_ENAB yes # 删除用户的时候,当用户组内没有其他用户时,是否删除用户组 centos7中,创建用户的时候,用户的GID是100(user)
ENCRYPT_METHOD_SHA512 # 用户的密码使用SHA512加密
/etc/passwd
这个文件是以冒号为分割符(不允许修改)
/etc/shadow
由于/etc/passws允许所有用户读取,容易导致用户的密码泄露,所以linux系统将用户相关的密码信息从/etc/passwd分离出来,并且/etc/shadow,只有root用户有读的权限
/etc/ssh/sshd_config
可以解决暴力破解密码
Port 22 # 默认端口
ListenAddress 0.0.0.0 # 监听地址,只能使用这个地址进行ssh登录,一般改为跳板机地址
LoginGraceTime 30s # 连接主机时,输入密码的时间超过***时间后连接关闭
PermitRootLogin no # 是否允许root远程登录 不允许远程登录
MaxAuthTries 3 # 可以测试的密码次数
ClientAliveCountMax 3 # 超时的次数
禁止root远程登录后,可以通过普通用户登录系统后 ·su root · 切换用户
/etc/bashrc
这个文件是系统的环境变量的文件
- rw- r-- r--
文件所有者权限 文件所有者同用户组权限 其他用户对该文件的权限
-代表普通文件 d代表目录 l代表软连接
r 读权限4 w 写权限2 x 执行权限 1
777 666
022 022 umask的值
755(目录) 644(文件)
生产建议umask值为 027 意味着创建的目录权限为750 文件权限为640 其他用户对文件没有权限
/etc/profile
使文件生效
source /etc/profile
source /etc/bashrc
通过服务配置记录会话的命令内容
Linux 下查看用户登陆后的操作记录 在 linux 系统的环境下,不管是 root 用户还是其它的用户只有登陆系统后用进入操作我们都可以通过命令 history 来查看历史记录,可是假如一台 服务器多人登陆,一天因为某人误操作了删除了重要的数据。
这时候通过查看历史记录(命令:history)是没有什么意义了。那有没有什么办法实现通过记录登陆后的 IP 地址和某用户名所操作的历史记录 呢?答案:有的。
通过在 /etc/profile 里面加入以下代码就可以实现:
PS1="`whoami`@`hostname`:"'[$PWD]'
history
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e's/[()]//g'` #print $NF 取最后一个域的字段
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
if [ ! -d /tmp/dbasky ]
then
mkdir /tmp/dbasky
chmod 777 /tmp/dbasky
fi
if [ ! -d /tmp/dbasky/${LOGNAME} ]
then
mkdir /tmp/dbasky/${LOGNAME}
chmod 300 /tmp/dbasky/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date " %Y%m%d_%H%M%S"`
export HISTFILE="/tmp/dbasky/${LOGNAME}/${USER_IP} dbasky.$DT"
chmod 600 /tmp/dbasky/${LOGNAME}/*dbasky* 2>/dev/null
#其实通过上面的代码不能看出来,在系统的 /tmp 新建个 dbasky 目录,在目录中记录了所有的登陆过系统的用户和 IP 地址,是不是觉得很方便 呢?我们还可以用这个方法来监测系统的安全性。
#可以看到在使用 history 命令的时候是没时间显示,不知道这个命令是什么时候所执行,这个时候可以编辑 /etc/bashrc 文件,加入如下三 行: HISTFILESIZE=2000
HISTSIZE=3000
HISTTIMEFORMAT=”%Y%m%d-%H%M%S: ”
export HISTTIMEFORMAT
#保存后退出,关闭当前 shell,并重新登录
#这个时候,在~/.bash_History 文件中,就有记录命令执行的时间了
/etc/hosts.deny
登录服务器的黑名单
使用的服务是sshd
例
sshd:ALL # 禁止所有用户访问
/etc/hosts.allow
登录服务器的白名单
使用的服务是sshd
例
sshd:ip地址 # 配置管理机的地址或者vpn的地址
生产环境中一般是黑名单 禁止all 白名单 配置管理机的地址或者vpn的地址
已经有人进入系统获取root用户 稍稍反抗下
md5sum /etc/hosts.allow >> /root/md5 # 给白名单一个指纹文件 路径别太好找
md5sum --check md5 # 检测文件是否被改动
如何查看某些服务或者端口在未知的情况下出现问题了或者打开了
可以将服务的默认端口修改 比如 mysql 3306 redis 6379
扫描机器开启了哪些端口
ss -lntup #查看端口
netstat -lntup # 查看端口
需要先安装nmap
nmap ip地址
nmap -sS ip地址 # 加-sS扫描隐蔽性强
nmap -p 端口多个逗号隔开 ip地址 # nmap -p 3306,6379,80,22 127.0.0.1
nmap -sV 127.0.0.1 # 会扫描到服务的版本
nmap -A 127.0.0.1 # 扫描比较全面 甚至可以推测你的主机
iptables及firewalled加固服务器安全
四表五链
表:filter (默认),nat,mangle。
链:INPUT, PREROUTING, FORWARD, POSTROUTING, OUTPUT
基本语法
iptables -t 表名 管理选项 【链名】【匹配条件】【-j控制类型】
名词 | 解释 |
---|---|
-t | 每个表都可以用 不写默认filter表 |
管理选项 | 操作方式 如 插入,删除 ,查看等 |
链名 | |
匹配条件 | 数据包特征ip,端口邓 |
控制类型 | 数据包处理方式,ACCEOT允许,REJECT拒绝,DROP丢弃,LOG日志等 |
iptables -t filter -I INPUT -P icmp -j REJECT # 添加禁用ping规则
iptables -L # 查看表
-I : 在链的开头插入一条规则
-A: 在链的末尾追加一条规则
-D: 删除一条链
-F:清空