linux系统安全加固

 
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用户的和组具有写的权限

你可能感兴趣的:(linux,安全加固)