目录
1. Openssh 安全配置1.1. 禁止root用户登录1.2. 限定SSH验证重试次数1.3. 禁止证书上岸1.4. 利用证书替代密码认证1.5. 图形窗口客户端影象密码的问题1.6. 关闭 GSSAPI1.7. 禁止SSH端口映射1.8. IP地址限定2. Shell 安全2.1. .history 文件2.2. sudo 安全问题2.3. 临时文件安全2.4. 实行权限3. 防火墙3.1. 策略3.2. 防止成为跳板机3.3. 端口安全3.4. 封锁特定字符串4. Linux 系统资源调配4.1. /etc/security/limits.conf4.2. 关闭写磁盘I/O功能5. PAM 插件认证加固配置5.1. pam_tally2.so5.2. pam_listfile.so5.3. pam_access.so5.4. pam_wheel.so1. Openssh 安全配置这节紧张讲与SSH有关的安全配置
1.1. 禁止root用户登录
只许可普通用户上岸,然后通过su命令切换到root用过。后面还会将若何限定su命令
PermitRootLogin no
1.2. 限定SSH验证重试次数
超过3次socket连接会断开,效果不明显,有一点点用。
MaxAuthTries 3
1.3. 禁止证书上岸
证书上岸非常安全,但是很有可能正常用户在你不知道情形下,给你安装了一个证书,他随时都可能进入你的系统
任何一个有权限的用户都能很方便的植入一个证书到 .ssh/authorized_keys 文件中
PubkeyAuthentication noAuthorizedKeysFile /dev/null
1.4. 利用证书替代密码认证
是不是自相抵牾?这个跟上面讲的恰好相反,这里只许可利用key文件上岸。
PasswordAuthentication no
这种办法比起密码要安全的多,唯一要把稳的地方便是证书被拷贝 ,建议你给证书加上 passphrase。
证书的 passphrase 是可以通过openssl工具将其剥离的,SSH证书我没有试过,但是事理都差不多。
1.5. 图形窗口客户端影象密码的问题当你利用XShell, Xftp, WinSCP, SecureCRT, SecureFX ......等等软件登录时,该软件都供应记住密码的功能,使你下次再上岸的时候无须输入密码就可以进入系统。这样做的确非常方便,
但是你是否想过你的电脑一旦丢失或者被其他人进入,那有多么危险。我之前每天背着条记本电脑上班,上面安装着XShell并且密码全部影象在里面。这使我意识到一点电脑丢失,有多么恐怖。
禁止SSH客户端记住密码,你不要哀求别人那么做。你也无法掌握,终极我找到了一种办理方案。
ChallengeResponseAuthentication yes
每次上岸都回提示你输入密码。密码保存也无效。
1.6. 关闭 GSSAPIGSSAPIAuthentication no#GSSAPIAuthentication yes#GSSAPICleanupCredentials yes#GSSAPICleanupCredentials yes#GSSAPIStrictAcceptorCheck yes#GSSAPIKeyExchange no
1.7. 禁止SSH端口映射
禁止利用SSH映射Socks5翻墙等等
AllowTcpForwarding no
1.8. IP地址限定
只许可通过192.168.2.1,192.168.2.2 访问本机
# vim /etc/hosts.allowsshd:192.168.2.1,192.168.2.2
禁止所有人访问本机
# vim /etc/hosts.denysshd:ALL
上面使白名单策略,你也可以采取黑名单策略。
2. Shell 安全2.1. .history 文件SA的操作记录问题
通过~/.bash_history文件记录系统管理员的操作记录,定制.bash_history格式
HISTSIZE=1000HISTFILESIZE=2000HISTTIMEFORMAT="%Y-%m-%d-%H:%M:%S "export HISTTIMEFORMAT
看看实际效果
$ history | head 1 2012-02-27-09:10:45 do-release-upgrade 2 2012-02-27-09:10:45 vim /etc/network/interfaces 3 2012-02-27-09:10:45 vi /etc/network/interfaces 4 2012-02-27-09:10:45 ping www.163.com
2.2. sudo 安全问题
/etc/sudoers
Cmnd_Alias WEBMASTER = /srv/nginx/sbin/nginx, /srv/php/sbin/php-fpm, !/srv/mysql/bin/www localhost = NETWORKING, SERVICES, DELEGATING, PROCESSES, WEBMASTERCmnd_Alias Database = /usr/bin/mysqldump, /srv/mysql/bin/mysql, /u01/oracle/10.x.x/bin/sqlplusmysql localhost = NETWORKING, SERVICES, DELEGATING, PROCESSES, WEBMASTER, Database
利用www用户测试登录,无误后修正SSH配置文件,禁止root登录。
vim /etc/ssh/sshd_configPermitRootLogin no
然后在测试从www sudo 实行命令, 可能成功启动nginx 与 php-fpm
2.3. 临时文件安全临时文件不应该有实行权限
/tmp
/dev/sda3 /tmp ext4 nosuid,noexec,nodev,rw 0 0
同时利用符号连接将/var/tmp 指向 /tmp
/dev/shm
none /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0
2.4. 实行权限
以数据库为例,从安全角度考虑我们须要如下变动
chown mysql:mysql /usr/bin/mysqlchmod 700 /usr/bin/mysql
mysql用户是DBA专用用户, 其他用户将不能实行mysql等命令。
3. 防火墙开启防火墙
lokkit --enabled
3.1. 策略
默认INPUT,FORWARD,OUTPUT 三个都是ACCEPT
-P INPUT ACCEPT-P FORWARD ACCEPT-P OUTPUT ACCEPT
从安全的角度出发,INPUT,FORWARD,OUTPUT 三个都是DROP最安全,但配置的时候会给你带来非常多的不可预见的麻烦。
-P INPUT DROP-P FORWARD DROP-P OUTPUT DROP
折中的方案,也是打多少硬件防火墙厂商所采取的方案,他们都是采取INPUT默认禁用所有,OUTPUT默认许可所有,你只要关注INPUT规则即可。
-P INPUT DROP-P FORWARD ACCEPT-P OUTPUT ACCEPT
3.2. 防止成为跳板机
跳板机便是用户首先上岸任意一台做事器后,由该做事器在上岸其余一台做事器。
封锁22等端口,避免相互跳转
iptables -A OUTPUT -p tcp -m multiport --dports 22,21,873 -j REJECT/etc/init.d/iptables saveiptables -L -n
web 做事器禁止利用ssh,作为跳板机
用户将不能利用ssh命令上岸到其他电脑
3.3. 端口安全有一种情形,例如你的做事器被植入了木马,木马将开启一个Socket端口给远程骇客接入进来,常日会启动一个类似telnet做事器,若何防止未经许可的程序监听一个端口呢?
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT-A INPUT -m state --state INVALID,NEW -j DROP
用法
systemctl stop iptables启动 httpd / nginxsystemctl start iptables把稳必须按照上面的步骤,如果你试图如下考试测验将失落败
systemctl start iptables启动 httpd / nginx80端口将无法对外供应做事,由于当 -A INPUT -m state --state INVALID,NEW -j DROP 运行往后,任何试图监听端口的程序将被谢绝。
3.4. 封锁特定字符串下面的例子是谢绝爬虫
# iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "Spider" -j DROP# iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "Baidu" -j DROP# iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "Robat" -j DROP
4. Linux 系统资源调配4.1. /etc/security/limits.conf
很多资料上是这么写的
soft nofile 65535 hard nofile 65535
这样做是偷
nobody soft nofile 4096nobody hard nofile 8192
为什么会设置为nobody用户呢?由于root用户启动系统后web 做事器会利用nobody用户创建子进程,socket连接实际上是nobody用户在处理。root 仅仅是守护父进程。
mysql soft nofile 2048mysql hard nofile 2048
针对 mysql 做限定
提示关于 nofile 即打开文件数,这个跟socket有非常紧密的关系,在linux系统中任何设备都被看做是一个文件(字符设备),你连接一个鼠标,键盘,摄像头,硬盘等等都被看作打开一个设备文件,以是默认1024是远远不足的。
4.2. 关闭写磁盘I/O功能对付某些文件没必要记录文件的访问韶光,由其是在高并发的IO密集操作的环境下,通过两个参数可以实现noatime,nodiratime减少不必要的系统IO资源。
编辑/etc/fstab 添加 noatime,nodiratime 参数
/dev/sdb1 /www ext4 noatime,nodiratime 0 0
5. PAM 插件认证加固配置
配置文件
ls /etc/pam.d/chfn crond login passwd remote runuser-l smtp ssh-keycat sudo-i system-auth-acchsh fingerprint-auth newrole password-auth run_init smartcard-auth smtp.postfix su su-lconfig-util fingerprint-auth-ac other password-auth-ac runuser smartcard-auth-ac sshd sudo system-auth
认证插件
ls /lib64/security/
5.1. pam_tally2.so
此模块的功能是,上岸缺点输入密码3次,5分钟后自动解禁,在未解禁期间输入精确密码也无法上岸。
在配置文件 /etc/pam.d/sshd 顶端加入
auth required pam_tally2.so deny=3 onerr=fail unlock_time=300
查看失落败次数
# pam_tally2Login Failures Latest failure Fromroot 14 07/12/13 15:44:37 192.168.6.2neo 8 07/12/13 15:45:36 192.168.6.2
重置计数器
# pam_tally2 -r -u rootLogin Failures Latest failure Fromroot 14 07/12/13 15:44:37 192.168.6.2# pam_tally2 -r -u neoLogin Failures Latest failure Fromneo 8 07/12/13 15:45:36 192.168.6.2
pam_tally2 计数器日志保存在 /var/log/tallylog 把稳,这是二进制格式的文件
例 1. /etc/pam.d/sshd - pam_tally2.so
# cat /etc/pam.d/sshd#%PAM-1.0auth required pam_tally2.so deny=3 onerr=fail unlock_time=300auth requiredpam_sepermit.soauth include password-authaccount required pam_nologin.soaccount include password-authpassword include password-auth# pam_selinux.so close should be the first session rulesession required pam_selinux.so closesession required pam_loginuid.so# pam_selinux.so open should only be followed by sessions to be executed in the user contextsession required pam_selinux.so open env_paramssession optional pam_keyinit.so force revokesession include password-auth
以上配置root用户不受限定, 如果须要限定root用户,参考下面
auth required pam_tally2.so deny=3 unlock_time=5 even_deny_root root_unlock_time=1800
5.2. pam_listfile.so用户上岸限定
将下面一行添加到 /etc/pam.d/sshd 中,这里采取白名单办法,你也可以采取黑名单办法
auth required pam_listfile.so item=user sense=allow file=/etc/ssh/whitelist onerr=fail
将许可上岸的用户添加到 /etc/ssh/whitelist,除此之外的用户将不能通过ssh上岸到你的系统
# cat /etc/ssh/whitelistneowww
例 2. /etc/pam.d/sshd - pam_listfile.so
# cat /etc/pam.d/sshd#%PAM-1.0auth required pam_listfile.so item=user sense=allow file=/etc/ssh/whitelist onerr=failauth required pam_tally2.so deny=3 onerr=fail unlock_time=300auth requiredpam_sepermit.soauth include password-authaccount required pam_nologin.soaccount include password-authpassword include password-auth# pam_selinux.so close should be the first session rulesession required pam_selinux.so closesession required pam_loginuid.so# pam_selinux.so open should only be followed by sessions to be executed in the user contextsession required pam_selinux.so open env_paramssession optional pam_keyinit.so force revokesession include password-auth
sense=allow 白名单办法, sense=deny 黑名单办法
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/blacklist onerr=fail
更多细节请查看手册 $ man pam_listfile
5.3. pam_access.so编辑 /etc/pam.d/sshd 文件,加入下面一行
account required pam_access.so
保存后重启sshd进程
编辑 /etc/security/access.conf 文件
cat >> /etc/security/access.conf << EOF- : root : ALL EXCEPT 192.168.6.1EOF
只能通过 192.168.6.1 上岸, 添加多个IP地址
- : root : ALL EXCEPT 192.168.6.1 192.168.6.2
测试是否生效
5.4. pam_wheel.so限定普通用户通过su命令提升权限至root. 只有属于wheel组的用户许可通过su切换到root用户
编辑 /etc/pam.d/su 文件,去掉下面的注释
authrequiredpam_wheel.so use_uid
修正用户组别,添加到wheel组
# usermod -G wheel www# id wwwuid=501(www) gid=501(www) groups=501(www),10(wheel)
没有加入到wheel组的用户利用su时会提示密码禁绝确。
$ su - rootPassword:su: incorrect password