Linux 安全加固及优化 Linux 安全加固及优化.... 0 一、Linux系统优化及安全.... 1 1、保护引导过程... 1 2、内核参数优化... 1 3、系统用户优化... 2 4、密码口令策略修改... 3 5、历史命令保留和常用服务端口修改... 3 6、Banner伪装... 3 7、防火墙IPtables设置... 5 (1)iptables 防止CC攻击的规则... 5 (2)iptables 限制主机登录的规则。... 6 8、防止暴力登录... 6 9、监控所有终端用户操作... 6 10、更改危险文件(命令)权限... 7 11、杀毒软件... 7 12 、rootkit病毒检测... 9 (1)rkhunter 安装使用... 10 (2)Chkrootkit 安装使用... 10 13、inotify 监控系统文件... 11 ★ Inotify 和rsync 实现linux 系统文件,数据文件防篡改。... 12 二、系统应用安全配置.... 12 1、中间件 安全配置... 12 (1)、apache安全配置... 12 Apache 禁止数据目录执行php等脚本文件... 12 Apache禁用目录浏览和符号链接追踪... 13 (2)、nginx安全配置... 13 deny all;. 13 }. 13 2、php 安全配置... 13 一、Linux系统优化及安全 1、保护引导过程 echo “sp:S:respawn:/sbin/sulogin” >> /etc/inittab 已单用户启动需要输入主机密码。 ***禁用 ctrlaltdel。通过向类似这样一行(#ca::ctrlaltdel:/sbin/shutdown -t5 -rf now)添加一个井号(#) 2、内核参数优化 cat /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 /sbin/sysctl –p cat /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套接字拖死 3、系统用户优化 锁定系统自带的一些不常用的用户。 Bin、adm、lp、uucp、nuucp、hpdb、games passwd -l username 锁定 passwd -u username 解锁 4、密码口令策略修改 cat /etc/login.defs|grep PASS PASS_MAX_DAYS 90 #新建用户的密码最长使用天数 PASS_MIN_DAYS 0 #新建用户的密码最短使用天数 PASS_WARN_AGE 7 #新建用户的密码到期提前提醒天数 PASS_MIN_LEN 9 #最小密码长度9 5、历史命令保留和常用服务端口修改 #vi /etc/profile 修改HISTSIZE=5和HISTFILESIZE=5即保留最新执行的5条命令 常用服务入SSH,FTP,MYSQL,等,不要使用默认端口 6、Banner伪装 可以扰乱入侵者这对服务器信息的判断 a、Vsftpd banner 伪装 修改vsftpd.conf ftpd_banner=Welcome to Microsoft FTP service. b、Apache banner 伪装 修改/usr/local/apache/conf/httpd.conf文件,可以隐藏一些apache信息 如果要屏蔽掉所有信息,需要修改源码文件重新编译。 vim httpd-2.2.25/include/ap_release.h vim httpd-2.2.25/os/unix/os.h c、Nginx banner 伪装 在nginx.conf 的 http 块里面添加 server_tokens off; 若要彻底屏蔽,需要修改源码,重新安装 vim src/core/nginx.h d、 PHP banner修改 (后面有其他相应的安全设置) vim php.ini 修改expose_php On ——> expose_php = Off Php彩蛋,PHP源码/ext/standard/info.h http://www.leadkj.com/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 http://www.leadkj.com/?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 http://www.leadkj.com/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42 http://www.leadkj.com/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 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 7、防火墙IPtables设置 下面是linux一些常用的服务所需要的规则。(根据实际情况更改) cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak vi /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 8、防止暴力登录 ftp,ssh暴力登录,脚本实现。 9、监控所有终端用户操作 记录所有登录用户终端操作命令记录 vi /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 10、更改危险文件(命令)权限 只用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 11、杀毒软件 clamav的安装使用 安装配置clamav 下载 http://www.clamav.net/lang/en/download/sources/ 直接下载:http://downloads.sourceforge.net/clamav/clamav-0.98.1.tar.gz # groupadd clamav # useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav # tar zxvf clamav-0.88.tar.gz # cd clamav-0.88 # ./configure --prefix=/usr/local/clamav --sysconfdir=/etc --disable-zlib-vcheck --disable-dns --disable-clamuko # make # make install # touch /var/log/freshclam.log # chmod 777 /var/log/freshclam.log # chown clamav /var/log/freshclam.log # touch /var/log/clam.log # chmod 777 /var/log/clam.log # chown clamav /var/log/clam.log # mkdir /var/lib/clamav # chmod -R 700 /var/lib/clamav # chown clamav /var/lib/clamav # vi /etc/freshclam.conf 下面是修改过的地方 ,在Example前加上"#" 引用 #Example DatabaseDirectory /var/lib/clamav UpdateLogFile /var/log/freshclam.log # vi /etc/clamd.conf 在Example前加上"#" 引用 #Example LogFile /var/log/clam.log 至此,安装完成 /usr/local/clamav/bin/ 用freshclam升级病毒库: # /usr/local/clamav/bin/freshclam 使用方法: 查杀当前目录下的文件 # /usr/local/clamav/bin/clamscan ./ 查杀当前目录所有文件及目录! # /usr/local/clamav/bin/clamscan -r ./ 查杀dir目录, # /usr/local/clamav/bin/clamscan dir 查杀目录dir下所有文件及目录! # /usr/local/clamav/bin/clamscan -r dir 其他差数 -l [路径] [文件名] 增加扫描报告 # /usr/local/clamav/bin/clamscan -l /var/log/clamscan.log / --move [路径] 移动病毒文件至.. --remove [路径] 删除病毒文件 --unzip(unrar) 解压压缩文件扫描 这里clamscan的路径为/usr/local/clamav/bin/clamscan 使用的时候请注意路径 crontab -e 引用 30 3 * * * /usr/local/clamav/bin/freshclam 30 4 * * * /usr/local/clamav/bin/clamscan /www/www.**.com/www/htdocs/bbs/attachments/ -r --move /home/clamav 12 、rootkit病毒检测 工具 RkHunter和chkrootkit的安装使用 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 (1)rkhunter 安装使用 1)安装rkhunter [root@localhost pub]#tar zxf rkhunter-1.3.8.tar.gz [root@localhost pub]#cd rkhunter-1.3.8 [root@localhost rkhunter-1.3.8]# ./installer.sh –install 2)为基本系统程序建立校对样本(干净的系统) [root@localhost ~]# rkhunter --propupd [ Rootkit Hunter version 1.3.8 ] File created: searched for 165 files, found 136 [root@localhost ~]#ls /var/lib/rkhunter/db/rkhunter.dat /var/lib/rkhunter/db/rkhunter.dat 3)运行rkhunter检查系统 [root@localhost ~]# rkhunter --check [ Rootkit Hunter version 1.3.8 ] Checking system commands... …………………………………………………… 4)在线升级rkhunter [root@localhost ~]# rkhunter --update (2)Chkrootkit 安装使用 [root@www ~]# tar zxf chkrootkit.tar.gz [root@www ~]# cd chkrootkit-* [root@www ~]# make sense [root@www ~]# ./chkrootkit 进行系统整体检测 13、inotify 监控系统文件 安装方法: 1、 wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 2、tar xzf inotify-tools-3.14.tar.gz 3、cd inotify-tools-3.14 4、./configure --prefix=/usr/inotify-tools-3.14 5、make 6、make install 监控命令 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 参数说明 语法:inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] -h,–help 输出帮助信息 @ 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。 –fromfile 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。 -m, –monitor 接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。 -d, –daemon 跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。 -o, –outfile 输出事情到一个文件而不是标准输出。 -s, –syslog 输出错误信息到系统日志 -r, –recursive 监视一个目录下的所有子目录。 -q, –quiet 指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。 –exclude 正则匹配需要排除的文件,大小写敏感。 –excludei 正则匹配需要排除的文件,忽略大小写。 -t , –timeout 设置超时时间,如果为0,则无限期地执行下去。 -e , –event 指定监视的事件。 -c, –csv 输出csv格式。 –timefmt 指定时间格式,如(“%”后面的大小写代表不同的格式,如%y表示2位的年) %Y-%m-%d 日期:2012-10-13 %H:%M:%S 时间:15:45:05 是否显示该参数指定的时间,取决于–format选项中是否指定了“%T”。 –format 指定输出格式。 %w 表示发生事件的目录 %f 表示发生事件的文件 %e 表示发生的事件 %Xe 事件以“X”分隔 %T 显示由–timefmt定义的时间格式 Inotify监控比较大的目录的时候会报错,需要修改/proc/sys/fs/inotify/max_user_watches的值 也可以这样修改 建议写入sysctl.conf fs.inotify.max_user_watches=8192000 ★ Inotify 和rsync 实现linux 系统文件,数据文件防篡改。 二、系统应用安全配置 1、中间件 安全配置 (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; } } Client_max_body_size 2、php 安全配置 修改php.ini配置文件 open_basedir = .:/tmp/ #防止php木马跨站,重要!! 需要禁止的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来防止SQL注入 SQL注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。php.ini中有一个设置: magic_quotes_gpc = Off 这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,比如把 ' 转为 \'等,这对防止sql注射有重大作用。所以我们推荐设置为: magic_quotes_gpc = On (8) 关闭注册全局变量 在PHP中提交的变量,包括使用POST或者GET提交的变量,都将自动注册为全局变量,能够直接访问,这是对服务器非常不安全的,所以我们不能让它注册为全局变量,就把注册全局变量选项关闭: register_globals = Off 当然,如果这样设置了,那么获取对应变量的时候就要采用合理方式,比如获取GET提交的变量var,那么就要用$_GET['var']来进行获取,这个php程序员要注意。 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的,我们把它打开: safe_mode = on 用户组安全 当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。 建议设置为: safe_mode_gid = off 如果不进行设置,可能我们无法对我们服务器网站目录下的文件进行操作了,比如我们需要对文件进行操作的时候。 安全模式下执行程序主目录 如果安全模式打开了,但是却是要执行某些程序的时候,可以指定要执行程序的主目录: safe_mode_exec_dir = /usr/bin 一般情况下是不需要执行什么程序的,所以推荐不要执行系统程序目录,可以指向一个目录,然后把需要执行的程序拷贝过去,比如: safe_mode_exec_dir = /tmp/cmd 但是,我更推荐不要执行任何程序,那么就可以指向我们网页目录: safe_mode_exec_dir = /usr/www 错误信息控制 一般php在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含php脚本当 前的路径信息或者查询的SQL语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建议禁止错误提示: display_errors = Off 如果你却是是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息: error_reporting = E_WARNING & E_ERROR 当然,我还是建议关闭错误提示。 错误日志 建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因: log_errors = On 同时也要设置错误日志存放的目录,建议根apache的日志存在一起: error_log = D:/usr/local/apache2/logs/php_error.log 注意:给文件必须允许apache用户的和组具有写的权限