概述
http://www.cnblogs.com/chenpingzhao/p/6443354.html
写在前面:当你部署一台服务器,第一步不应该是部署应用,安全是才是首要任务
如果某一天当你登录服务器发现 /bin/bash –i,python -c 'import pty; pty.spawn("/bin/sh")' 等命令在服务器上出现的时候,那么恭喜你,服务器被入侵了
但是入侵者都是很聪明的,首先会执行以下命令
1
|
unset
HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG;
export
HISTFILE=
/dev/null
;
export
HISTSIZE=0;
export
HISTFILESIZE=0
|
然后是通过跳板访问
1
|
ssh
-o UserKnownHostsFile=
/dev/null
-T user@host
/bin/bash
–i
|
建立ttyshell
1
|
python -c ‘
import
pty; pty.spawn(“
/bin/sh
”)’
|
然后清除访问记录
1
|
shred -n 31337 -z -u file_to_delete
|
等等。。。一系列的操作
然后你就能看到服务器上会留下以上的蛛丝马迹,那么我们如何防止呢?
1、系统用户优化
用户是Linux中安全加固的第一关,如果系统中本身就存在有安全隐患的用户,那么再安全策略也无法起到加固的效果
1
2
|
cat
/etc/passwd
|
awk
-F:
'$3==0'
//
列出具有超级权限的用户
cat
/etc/passwd
|
grep
'/bin/bash'
//
列出具有登录shell的用户
|
如果除了root还有其他的超级用户,那就要非常小心了
1.1 将系统自带的用户和用户组删除掉
删除的用户,如adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher
删除的组,如adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers
1.2 或者锁定不需要登录的用户
如:xfs,news,nscd,dbus,vcsa,games,nobody,avahi,haldaemon,gopher,ftp,mailnull,pcap,mail,shutdown,halt,uucp,operator,sync,adm,lp,bin,sys,nuucp,hpdb,www,daemon
1.3 限制能够su为root的用户
1
2
|
#在 /etc/pam.d/su 头部添加:
auth required
/lib/security/pam_wheel
.so group=wheel
|
这样,只有wheel组的用户可以su到root
1.4 检查shadow中空口令帐号
1
|
awk
-F:
'( $2== "") { print }'
/etc/shadow
|
对空口令账号进行锁定,或要求增加密码
1.5 系统关键目录权限控制
根据安全需要,配置某些关键目录其所需的最小权限,password文件、shadow文件、group文件权限。
/etc/passwd 所有用户都可读,root用户可写 –rw-r—r—
1
|
chmod
644
/etc/passwd
|
/etc/shadow 只有root可读 –r——–
1
|
chmod
600
/etc/shadow
|
/etc/group 必须所有用户都可读,root用户可写 –rw-r—r—
1
|
chmod
644
/etc/group
|
2、系统服务优化
一般情况下,系统可能会自动的运行一些不必要的服务,我们可以使用下面的命令查看当前默认开启运行的系统服务:
1
|
chkconfig --list |
grep
"3:on"
|
如果我们只是提供web服务,那么对于sendmail、nfs、postfix、ftp等不需要的服务就可以关闭了
对于关键的服务,我们需要保证它们的运行,比如:iptables、sshd、syslog、httpd、nginx、mysql、php-fpm等。
3、ssh访问策略
ssh的访问都是我们日常工作中几乎唯一的控制系统的手段。所以ssh的安全性非常重要,一般来说较高的ssh安全策略秉承以下几个原则。
-
禁止root用户ssh登录。
-
禁止口令的方式验证。
-
只允许一个用户拥有sudo的完整权限。
-
除非是堡垒机,系统中不允许存放私钥文件。
-
使用一个随机端口来代替22端口。
编辑 /etc/sudoers,加入一条:
1
|
test
ALL=(ALL) NOPASSWD: ALL
|
这里的例子表示:将test赋予完全的sudo权限,并在sudo提权时不需要验证密码。
1
2
|
sed
-i
's/(PasswordAuthentication) yes/1 no/'
/etc/ssh/sshd_config
//
禁止口令,使用证书
sed
-i
's/(PermitRootLogin) yes/1 no/'
/etc/ssh/sshd_config
//
禁止root用户
ssh
登录
|
现在我们来看ssh的访问效果:
-
所有用户不能使用密码验证登录。
-
root用户不可直接登录的,即使拥有root密码,唯一获得root的方法是使用test用户提权。
-
test用户只可以使用证书登录。
-
ssh不再使用默认的22端口
4、系统内部安全配置
4.1、保护引导过程
1
2
3
4
5
|
//
用户启动需要输入主机密码
echo
"sp:S:respawn:/sbin/sulogin"
>>
/etc/inittab
//
编辑
/etc/init/control-alt-delete
.conf,禁用 ctrlaltdel
start on control-alt-delete 更改为
#start on control-alt-delete
|
4.2、内核修改
/etc/sysctl.conf 改为以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
kernel.shmall = 268435456
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.wmem_max = 873200
net.core.rmem_max = 873200
net.ipv4.tcp_wmem = 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
net.core.somaxconn = 256
net.core.netdev_max_backlog = 1000
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_keepalive_time = 500
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0
|
/etc/security/limits.conf 改为以下内容
1
2
|
* soft nofile 655360
* hard nofile 655360
|
解释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,
#TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。
#对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,
#但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死
|
4.3 密码口令策略修改
1
2
3
4
5
|
cat
/etc/login
.defs|
grep
PASS
PASS_MAX_DAYS 90
#新建用户的密码最长使用天数
PASS_MIN_DAYS 0
#新建用户的密码最短使用天数
PASS_WARN_AGE 7
#新建用户的密码到期提前提醒天数
PASS_MIN_LEN 9
#最小密码长度9
|
4.4 历史命令保留和常用服务端口修改
1
2
3
|
vim
/etc/profile
修改HISTSIZE=5和HISTFILESIZE=5即保留最新执行的5条命令
常用服务入SSH,FTP,MYSQL,等,不要使用默认端口
|
4.5、Banner伪装
可以扰乱入侵者这对服务器信息的判断
a、Vsftpd banner 伪装
修改vsftpd.conf
ftpd_banner=Welcome to Microsoft FTP service.
b、Apache banner 伪装
修改/usr/local/apache/conf/httpd.conf文件,可以隐藏一些apache信息,如果要屏蔽掉所有信息,需要修改源码文件重新编译
httpd-2.2.25/include/ap_release.h
httpd-2.2.25/os/unix/os.h
c、Nginx banner 伪装
在nginx.conf 的 http 块里面添加 server_tokens off;
若要彻底屏蔽,需要修改源码,重新安装
src/core/nginx.h
d、 PHP banner修改
php.ini 修改expose_php On —> expose_php = Off
Php彩蛋,PHP源码/ext/standard/info.h
e、 TTL值修改
echo net.ipv4.ip_default_ttl = 128 >> /etc/sysctl.conf
/sbin/sysctl –p
f、利用iptables,将本机的TCP 3389端口转移到其它开有3389端口的计算机上,给Linux系统伪装出一个提供服务的TCP 3389端口
1
2
3
|
echo
1 >
/proc/sys/net/ipv4/ip_forward
iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to xx.xx.xx.xx
iptables -t nat -I POSTROUTING -p tcp --dport 3389 -j MASQUERADE
|
4.6、防火墙IPtables设置
下面是linux一些常用的服务所需要的规则。(根据实际情况更改)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
vim
/etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Thu Oct 31 19:38:46 2013
*filter
:INPUT ACCEPT [782:100478]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [227493:21979253]
-A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT (可以用后面的防CC的规则替代)
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT –p tcp -j REJECT –reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Thu Oct 31 19:38:46 2013
service iptables save
service iptables restart
|
(1) iptables 防止CC攻击的规则
安装 kernel-smp-modules-connlimit 、recent 内核模块
modprobe ipt_connlimit
如果没有这个文件需要新建如下文件
1
2
3
4
|
# cat /etc/modprobe.d/ipt.conf
options ipt_recent ip_pkt_list_tot=200
modprobe –r ipt_recent
|
控制单个IP的最大并发连接数
1
2
3
4
|
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
#允许单个IP的最大连接数为 30
//
控制单个IP在一定的时间(比如60秒)内允许新建立的连接数
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --
set
-j ACCEPT
#单个IP在60秒内只允许最多新建30个连接
|
(2)iptables 限制主机登录的规则
1
2
3
|
//
限制每个主机每小时只能连接5次主机(INPUT链默认规则为ACCEPT)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --
set
-j ACCEPT
|
4.7、防止暴力登录
ftp,ssh暴力登录,脚本实现。
4.8、监控所有终端用户操作
记录所有登录用户终端操作命令记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
vim
/etc/profile
PS1=
"`whoami`@`hostname`:"
'[$PWD]'
history
USER_IP=`
who
-u am i 2>
/dev/null
|
awk
'{print $NF}'
|
sed
-e
's/[()]//g'
`
if
[
"$USER_IP"
=
""
]
then
USER_IP=`
hostname
`
fi
if
[ ! -d
/tmp/csi
]
then
mkdir
/tmp/csi
chmod
777
/tmp/csi
fi
if
[ ! -d
/tmp/csi/
${LOGNAME} ]
then
mkdir
/tmp/csi/
${LOGNAME}
chmod
300
/tmp/csi/
${LOGNAME}
fi
export
HISTSIZE=4096
DT=`
date
"+%Y-%m-%d_%H:%M:%S"
`
export
HISTFILE=
"/tmp/csi/${LOGNAME}/${USER_IP} csi.$DT"
chmod
600
/tmp/csi/
${LOGNAME}/*csi* 2>
/dev/null
source
/etc/profile
|
4.9 日志审计
统一远程日志服务器配置,当前系统应配置远程日志功能,将需要重点关注的日志内容传输到日志服务器进行备份。
修改配置文件 /etc/rsyslog.conf
加上这一行:authpriv.* @x.x.x.x
重新启动syslog服务,执行下列命令:services syslogd restart
4.10、更改危险文件(命令)权限
只有root用户能使用一下命令
1
2
3
4
5
6
7
8
9
10
11
12
13
|
chmod
700
/bin/ping
chmod
700
/usr/bin/finger
chmod
700
/usr/bin/who
chmod
700
/usr/bin/w
chmod
700
/usr/bin/locate
chmod
700
/usr/bin/whereis
chmod
700
/sbin/ifconfig
chmod
700
/usr/bin/pico
chmod
700
/usr/bin/vi
chmod
700
/usr/bin/which
chmod
700
/usr/bin/gcc
chmod
700
/usr/bin/make
chmod
700
/bin/rpm
|
4.11、杀毒软件
下载 http://www.clamav.net/lang/en/download/sources/
直接下载:http://downloads.sourceforge.net/clamav/clamav-0.98.1.tar.gz
4.12 、rootkit病毒检测
Rkhunter 下载:http://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.2/rkhunter-1.4.2.tar.gz
chkrootkit 下载:ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
4.13、inotify 监控系统文件
监控命令
1
|
inotifywait -m -d -o
/tmp/inotify
.log -r --timefmt
"%F %T"
--
format
'%T %w%f%:e'
-e close_write,create, modify,attrib
/var/www/html
|
Inotify监控比较大的目录的时候会报错,需要修改/proc/sys/fs/inotify/max_user_watches的值
建议写入sysctl.conf:fs.inotify.max_user_watches=8192000
5、系统应用安全配置
5.1、中间件 安全配置
(1) apache安全配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//Apache
禁止数据目录执行php等脚本文件
<Directory
"/path/directory"
>
<FilesMatch
".(php|asp|jsp)$"
>
Deny from all
<
/FilesMatch
>
<
/Directory
>
//Apache
禁用目录浏览和符号链接追踪
<Directory
"/usr/local/apache/htdocs"
>
Options Indexes FollowSymLinks
#禁用这两项
AllowOverrride None
Order allow,deny
Allow from all
<
/Directory
>
|
(2) nginx安全配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//Nginx
禁止数据目录执行php等脚本文件(在nginx.conf server段配置)
//
单个目录
location ~* ^
/attachments/
.*.(php|php5)$ {
deny all;
}
//
多个目录
location ~* ^/(image|upload)/.*.(php|php5)$ {
deny all;
}
//nginx
的限制连接模块limit_zone与limit_req_zone
//limit_zone
配置
http{
limit_conn_zone $binary_remote_addr zone=one:10m;
#one是zone的名字,10m是会话状态存储空间
server{
limit_zone one 1;
#1每秒限制链接1次
}
}
//Limit_req_zone
配置
http{
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r
/s
;
# rate=1r/s 的意思是每个地址每秒只能请求一次,也就是说根据漏桶原理burst=120 一共有120块令牌,并且每秒钟只新增1块令牌120块令牌发完后 多出来的那些请求就会返回503
server{
limit_req zone=req_one burst=120;
}
}
|
5.2、php 安全配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
open_basedir = .:
/tmp/
#防止php木马跨站,重要!!
disable_funcation=chdir,
dir
,get_cwd,opendir,readdir,scandir,fopen,unlink,delete,copy,
mkdir
,
rmdir
,rename,
file
,
file_get_contents,fputs,fwrite,
chmod
,phpinfo,passthru,
exec
,system,chroot,scandir,
chgrp
,
chown
,shell_exec,proc_open,
proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,
symlink
,popepassthru,stream_socket_server,
escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,
posix_ctermid,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,osix_getgrgid,
posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix_getppid,
posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,
posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,
posix_ttyname,posix_uname
//
如果服务器用到了采集,需要启用unlink和fopen, file_get_contents,fputs,fwrite,
dir
//
后台上传图片用到的函数
mkdir
,
file
,file_get_contents,fputs,fwrite,
dir
magic_quotes_gpc = Off
//
打开magic_quotes_gpc来防止SQL注入
magic_quotes_gpc = On
//
如果它打开后将自动把用户提交对sql的查询进行转换,比如把 ' 转为 '等,这对防止sql注射有重大作用。所以我们推荐设置为:
register_globals = Off
//
关闭注册全局变量
safe_mode = on
//php
的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如
/etc/passwd
,但是默认的php.ini是没有打开安全模式的,我们把它打开:
safe_mode_gid = off
//
用户组安全,当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。
safe_mode_exec_dir =
/usr/www
display_errors = Off
error_reporting = E_WARNING & E_ERROR
log_errors = On
error_log = D:
/usr/local/apache2/logs/php_error
.log
//
注意:给文件必须允许apache用户的和组具有写的权限
|
参考文章
http://m.jb51.net/hack/55784.html
https://blog.slogra.com/post-684.html
http://blog.chinaunix.net/uid-25723371-id-4542221.html
- 作者:踏雪无痕
- 出处:http://www.cnblogs.com/chenpingzhao/
最后
以上就是忧虑人生为你收集整理的Linux系统安全需要注意的一些问题 http://www.cnblogs.com/chenpingzhao/p/6443354.html 的全部内容,希望文章能够帮你解决Linux系统安全需要注意的一些问题 http://www.cnblogs.com/chenpingzhao/p/6443354.html 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复