Linux系统安全须要注意的一些问题

写在前面:当你部署一台服务器,第一步不该该是部署应用,安全是才是首要任务php

若是某一天当你登陆服务器发现 /bin/bash –i,python -c 'import pty; pty.spawn("/bin/sh")' 等命令在服务器上出现的时候,那么恭喜你,服务器被入侵了html

可是入侵者都是很聪明的,首先会执行如下命令python

unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0

而后是经过跳板访问mysql

ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i

创建ttyshelllinux

python -c ‘import pty; pty.spawn(“/bin/sh”)’

而后清除访问记录nginx

shred -n 31337 -z -u file_to_delete

等等。。。一系列的操做web

而后你就能看到服务器上会留下以上的蛛丝马迹,那么咱们如何防止呢?sql

一、系统用户优化 

用户是Linux中安全加固的第一关,若是系统中自己就存在有安全隐患的用户,那么再安全策略也没法起到加固的效果 shell

cat /etc/passwd | awk -F: '$3==0'  //列出具备超级权限的用户
cat /etc/passwd | grep '/bin/bash'  //列出具备登陆shell的用户

若是除了root还有其余的超级用户,那就要很是当心了
apache

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的用户

#在 /etc/pam.d/su 头部添加:
auth required /lib/security/pam_wheel.so group=wheel

这样,只有wheel组的用户能够su到root

1.4 检查shadow中空口令账号

awk -F: '( $2== "") { print }' /etc/shadow

对空口令帐号进行锁定,或要求增长密码

1.5 系统关键目录权限控制

根据安全须要,配置某些关键目录其所需的最小权限,password文件、shadow文件、group文件权限。

/etc/passwd 全部用户均可读,root用户可写 –rw-r—r—

chmod 644 /etc/passwd

/etc/shadow 只有root可读 –r——–

chmod 600 /etc/shadow

/etc/group 必须全部用户均可读,root用户可写 –rw-r—r—

chmod 644 /etc/group

二、系统服务优化  

通常状况下,系统可能会自动的运行一些没必要要的服务,咱们可使用下面的命令查看当前默认开启运行的系统服务: 

chkconfig --list | grep "3:on"

若是咱们只是提供web服务,那么对于sendmail、nfs、postfix、ftp等不须要的服务就能够关闭了

对于关键的服务,咱们须要保证它们的运行,好比:iptables、sshd、syslog、httpd、nginx、mysql、php-fpm等。 

三、ssh访问策略  

ssh的访问都是咱们平常工做中几乎惟一的控制系统的手段。因此ssh的安全性很是重要,通常来讲较高的ssh安全策略秉承如下几个原则。 

  • 禁止root用户ssh登陆。

  • 禁止口令的方式验证。

  • 只容许一个用户拥有sudo的完整权限。

  • 除非是堡垒机,系统中不容许存放私钥文件。

  • 使用一个随机端口来代替22端口。

编辑 /etc/sudoers,加入一条: 

test ALL=(ALL)       NOPASSWD: ALL

这里的例子表示:将test赋予彻底的sudo权限,并在sudo提权时不须要验证密码。 

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.一、保护引导过程

//用户启动须要输入主机密码
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.二、内核修改

/etc/sysctl.conf 改成如下内容

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 改成如下内容

* soft nofile 655360
* hard nofile 655360

解释

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 密码口令策略修改

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 历史命令保留和经常使用服务端口修改

vim /etc/profile
修改HISTSIZE=5和HISTFILESIZE=5即保留最新执行的5条命令
经常使用服务入SSH,FTP,MYSQL,等,不要使用默认端口

4.五、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端口

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.六、防火墙IPtables设置

下面是linux一些经常使用的服务所须要的规则。(根据实际状况更改)

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
若是没有这个文件须要新建以下文件

# cat /etc/modprobe.d/ipt.conf

options ipt_recent ip_pkt_list_tot=200
modprobe –r ipt_recent

控制单个IP的最大并发链接数

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 限制主机登陆的规则

//限制每一个主机每小时只能链接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.七、防止暴力登陆

ftp,ssh暴力登陆,脚本实现。

4.八、监控全部终端用户操做

记录全部登陆用户终端操做命令记录

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.十、更改危险文件(命令)权限

只有root用户能使用一下命令

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.十一、杀毒软件

下载 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.1三、inotify 监控系统文件

监控命令

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.一、中间件 安全配置

(1) apache安全配置

//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安全配置

//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.二、php 安全配置

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

相关文章
相关标签/搜索