LAMP安全全攻略
LINUX加固
1.BIOS...................................................................................................
2.SSH 安全............................................................................................
3.禁用telnet..........................................................................................
4.禁用代码编译....................................................................................
5.ProFTP................................................................................................
6.TCPwrappers......................................................................................
7.创建一个SU 组.................................................................................
8.root 通知.............................................................................................
9.history 安全........................................................................................
10.欢迎信息..........................................................................................
11.禁用所有特殊账户..........................................................................
12.chmod 危险文件..............................................................................
13.指定允许root 登陆的TTY 设备....................................................
14.选择一个安全的密码......................................................................
15.检查Rootkit.....................................................................................
16.安装补丁..........................................................................................
17.隐藏Apache 信息...........................................................................
18.隐藏php 信息.................................................................................
19.关闭不使用的服务..........................................................................
20.检测监听中的端口..........................................................................
21.关闭打开的端口和服务..................................................................
22.删除不用的rpm 包..........................................................................
23.禁用危险的php 函数......................................................................
24.安装配置防火墙.............................................................................
25.安装和配置BFD............................................................................
26.内核加固(sysctl.conf)......................................................................
27.更改SSH 端口................................................................................
28./tmp /var/tmp,/dev/shm 分区安全...................................................
29.PHP IDS...........................................................................................
Apache加固
1.修改banner.......................................................................................
2.修改默认的http 状态响应码404,503 等默认页面........................
3.Apache 的访问权限控制................................................................
LAMP 安全全攻略
4.关闭危险指令....................................................................................
5.open_basedir 限制目录....................................................................
6.掌握Apache 的Order Allow Deny 判断原则................................
7.mod_rewrite 重写URL.....................................................................
9.Speling 模块去除url 大小写............................................................
8. Limit 模块限制IP 连接数..............................................................
9.让apache 支持安全HTTPS 协议...................................................
10.安装配置mod_security.....................................................................
11.加载speling 模块...............................................................................
Php 加固
1. 打开php 的安全模式.....................................................................
2. 安全模式下执行程序主目录.......................................................
3. 安全模式下包含文件......................................................................
4. 控制php 脚本能访问的目录.........................................................
5. 关闭危险函数...................................................................................
6. 关闭PHP 版本信息在http 头中的泄漏.........................................
7. 关闭注册全局变量.........................................................................
8. 打开magic_quotes_gpc 来防止SQL 注入......................................
9. 错误信息控制....................................................................................
10. 错误日志.............................................................................................
11. 关闭远程文件打开.............................................................................
12. Php.ini 包含补丁文件.........................................................................
mysql方面:
1.修改root 用户口令,删除空口令...........................................................
2.删除默认数据库和数据库用户..................................................................
3.改变默认mysql 管理员帐号...................................................................
4.关于密码的管理........................................................................................
5.使用独立用户运行msyql ...........................................................................
6.禁止远程连接数据库.................................................................................
7.限制连接用户的数量..................................................................................
8.用户目录权限限制......................................................................................
9.命令历史记录保护.........................................................................................
10.禁止MySQL 对本地文件存取................................................................
11.MySQL 服务器权限控制...........................................................................
12.使用chroot 方式来控制MySQL 的运行目录...........................................
13.关闭对无关的Web 程序访问的支持.........................................................
14.数据库备份策略.............................................................................................
15. Mysqld 安全相关启动选项..........................................................................
16.information_schema 安全..............................................................................
总结
LAMP 安全全攻略
========================================================================
介绍
这个教程将一步步的指引你,使你的Linux 系统变得安全。
任何默认安装的操作系统都是不够安全的,本文将指引你如何建立一个
相对安全的Linux 系统。
========================================================================
1.BIOS
你应该总是在系统启动的时候设置一个BIOS 密码和禁用从CD-ROM 和软盘引导。
这将防止一些人未经允许访问你的系统和更改BIOS 设置
2.SSH安全
SSH 是一个协议,利用它可以登录到一个远程系统或远程执行系统命令,
默认允许root 登录,并且sshv1 存在缺陷,我们应该在
sshd_config 禁止root 访问和使用sshv2 来让ssh 更加安全。
方法:
vi /etc/ssh/sshd_config
把协议改为2
PermitRootLogin = no
重启sshd /etc/rc.d/init.d/sshd restart
3.禁用telnet
早期的Linux 默认开启telnet 服务,telnet,ftp,rlogin 都是明文传输的协议
是容易被嗅探到的,这就是为什么推荐使用安全的版本(sftp,scp,ssh)的原因
如果你必须要使用telnet,那么至少应该隐藏banner 信息
方法:
修改/etc/xinetd.d/telnet
disable=yes
4.禁用代码编译
你可以禁用代码编译并且只把编译的权限分配给一个用户组
方法:
添加编译用户组/usr/sbin/groupadd compiler ,cd /usr/bin
把常见的编译器所属组赋给编译用户组
chgrp compiler *cc*
chgrp compiler *++*
chgrp compiler ld
chgrp compiler as
设置mysqlaccess 的访问
chgrp root mysqlaccess
设置权限
chmod 750 *cc*
LAMP 安全全攻略
chmod 750 *++*
chmod 750 ld
chmod 750 as
chmod 755 mysqlaccess
把用户添加到组里
修改/etc/group
compiler:x:520:user1,user2
5.ProFTP
你可以通过修改proftpd.conf 来禁止root 登陆
方法:
修改/etc/proftpd.conf
Add RootLogin off
重启proftpd /sbin/service proftpd stop
/sbin/service proftpd start
6.TCP wrappers
编辑hosts.allow 和hosts.deny 可以限制或允许访问inet 服务
方法:
限制访问inet 服务
修改/etc/hosts.allow
建议格式:
#Approved IP addresses
ALL:192.168.0.1
ALL:192.168.5.2
#CSV uploader machine
proftpd:10.0.0.5
#pop3 from antwhere
ipop3:ALL
修改/etc/hosts.deny
ALL:ALL EXCEPT localhostENY
7.创建SU用户组
因为我们在SSH 禁止了root 用户访问并且禁用了telnet,所有我们应该
分配给一些用户su 权限来获取root 特权
方法:
vi /etc/group
添加一行wheel:x:10:root,user1,user2
chgrp wheel /bin/su
chmod o-rwx /bin/su
8.root 通知
LAMP 安全全攻略
当一个具有root 权限的用户登录的时候发mail
方法:
编辑/root 下的.bashrc ,当有root 权限的用户登录时发生email 通知
echo 'ALERT - Root Shell Access (Server Name) on:' `date` `who` | mail -s "Alert: Root Access from `who | cut -
d"(" -f2 | cut -d")" -f1`" your@email.com
9.history安全
这是一个避免删除.bash_history 或重定向到/dev/null 的好主意
因此他不能清除或删除他最后执行的命令
方法:
chattr +a .bash_history
chattr +i .bash_history
获取用户的人会知道他的历史命令锁定并且要同意才可以使用服务
10.使用欢迎信息
你必须提供一些信息让攻击者知道该系统不对公众开放。
在国外有类似案件,攻击者入侵一个系统并且系统没有这些信息,
这种情况下法院不能做任何裁决,因为系统说welcome
方法:
删除/etc/redhat-release
编辑/etc/issue /etc/motd 并显示警告信息
11.禁用所有特殊账户
你应该从系统中删除所有默认用户和组
例如news,lp,sync,shutdown,uucp,games,halt 等
方法:
删除账户userdel name
删除组groupdel name
锁定特定账户:/usr/sbin/usermod -L -s /bin/false user
12.chmod危险文件
这可能是限制不具有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
LAMP 安全全攻略
chmod 700 /usr/bin/gcc
chmod 700 /usr/bin/make
chmod 700 /bin/rpm
13.指定允许root登陆的TTY设备
/etc/securetty 文件允许你指定root 可以从哪个TTY 设备登录
方法:
vi /etc/securetty
只留2 个连接
tty1
tty2
14.选择一个安全的密码
在/etc/login.defs 文件中定义了shadow 密码的具体配置
默认密码长度最短为5 字符,你应该至少设置为8
方法:
vi /etc/login.defs
PASS_M IN_LEN 8
15.检测Rootkit
用chkrootkit 或rkhunter,以chkrootkit 为例
方法:
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.md5
首先检查md5 校验值: md5sum chkrootkit.tar.gz
然后解压安装
tar -zxvf chkrootkit.tar.gz
cd chkrootkit
./configure
make sense
然后运行./chkrootkit
我们可以将其添加到contrab 使其每天自动扫描:
vi /etc/cron.daily/chkrootkit.sh
#!/bin/bash
# 输入chkrootkit 的安装目录
cd /root/chkrootkit/
# 输入你想收到检测报告的email
./chkrootkit | mail -s "Daily chkrootkit from Server Name" your@email.com
16.安装补丁
你要经常检查更新以修复某些缺陷或系统稳定性的改进
否则你存在漏洞的系统将会不时的遭受新的攻击
LAMP 安全全攻略
方法:
列出可用更新:up2date -l
安装未排除的更新:up2date -u
安装包括排除的更新up2date -uf
17.隐藏Apache信息
你应该隐藏Apache 的banner 信息使攻击者不知道Apache 的版本,从而使他们难以利用漏洞
方法:
修改/etc/httpd/conf/httpd.conf
改变服务器签名:ServerSi gnature Off
重启Apache /sbin/service httpd restart
18.隐藏php信息
你应该隐藏php 的banner 信息,原因同上
方法:
修改php.ini
改变expose_php=Off
重启Apache
19.关闭不用的服务
你应该把任何未使用的服务关闭,可以在/etc/xinetd.d 文件夹里找到
方法:
cd /etc/xinetd.d
grep disable *
这将显示所有服务开启或关闭的状态,然后根据需要来开启或关闭服务
20.检测监听的端口
检测是否有必要开放端口是非常重要的
方法:
netstat -tulp 或
lsof -i -n | egrep 'COMMAND|LISTEN|UDP'或
nmap!
21.关闭端口和服务
重点是关闭在系统启动时打开的不需要的端口
方法:
对于正在运行的服务,可以执行chkconfig -list | grep on
禁用服务可以执行chkconfig servicename off
然后停止正在运行的服务:/etc/init.d/service stop
22.删除不用的rpm 包
首先应该清楚你的系统的作用,它是web,mail,file 服务器或其他
然后觉得哪些包是必要的,之后删除不需要的软件包
方法:
LAMP 安全全攻略
首先列出安装列表rpm -qa
更详细的信息rpm -qi rpmname
还可以检测删除包可能出现的冲突rpm -e --test rpmname
23.禁用危险的php函数
你应该禁用php 的危险函数防止在网站上执行系统命令
方法:
whereis php.ini
vi /usr/local/lib/php.ini
编辑disable_functions = "symlink,shell_exec,exec,proc_close,proc_open,popen,
system,dl,passthru,escapeshellarg, escapeshellcmd"
24.安装配置防火墙
高级策略防火墙(APF)是一种IP 表(网络过滤),它是基于当今互联网部署服务器防火墙系统的基本需要和
客户部署LINUX 安装的唯一需要而设计的。它是最好的开源防
火墙之一。
配置APF 防火墙方法:
下载APF:wget http://www.r-fx.ca/downloads/apf-current.tar.gz
解压安装:
tar -zxvf apf-current.tar.gz
cd apf-0.9.7-1
./install.sh
然后我们配置它vi /etc/apf/conf.apf
一般配置:
启用防火墙使用DShield.org 块列表
USE_DS="1"
然后我将列出常规的配置和CPanel 配置方式,因为CPanel 是应该最广泛的虚拟主机管理软件
1.常规配置(DNS,Mail,Web,FTP)
Common ingress (inbound)
# Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD
IG_TCP_CPORTS="21,22,25,53,80,110,143,443,995"
#
# Common ingress (inbound) UDP ports IG_UDP_CPORTS="53"
# Egress filtering [0 = Disabled / 1 = Enabled]
EGF="1"
# Common egress (outbound) TCP ports
EG_TCP_CPORTS="21,25,80,443,43"
#
# Common egress (outbound) UDP ports
EG_UDP_CPORTS="20,21,53"
LAMP 安全全攻略
2.CPanel 配置
Common ingress (inbound) ports
# Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD
IG_TCP_CPORTS="21,22,25,53,80,110,143,443,2082,2083, 2086,2087,
2095, 2096,3000_3500"
#
# Common ingress (inbound) UDP ports
IG_UDP_CPORTS="53"
Common egress (outbound) ports
# Egress filtering [0 = Disabled / 1 = Enabled]
EGF="1"
# Common egress (outbound) TCP ports
EG_TCP_CPORTS="21,25,80,443,43,2089"
#
# Common egress (outbound) UDP ports
EG_UDP_CPORTS="20,21,53"
之后启动防火墙/etc/apf/apf -s
如果运行良好我在回去修改配置文件,使DEVM="0"
然后我们配置APF 的AntiDos: vi /etc/apf/ad/conf.antidos
找到下面的内容并替换成你的资料
# Organization name to display on outgoing alert emails
CONAME="Your Company"
# Send out user defined attack alerts [0=off,1=on]
USR_ALERT="0"
#
# User for alerts to be mailed to
USR=you@yourco.com
你应把USR_ALERT 改为1
保存后重启APF:/etc/apf/apf –r
To make the firewall start with the Operating System: chkconfig --level 2345 apf on
APF 开机自启动:chkconfig --level 2345 apf on
禁止一个IP 用/etc/apf/apf -d ip 或vi /etc/apf/deny_hosts.rules
允许一个IP 用/etc/apf/apf -a ip 或vi /etc/apf/deny_hosts.rules
25.安装配置BFD(暴力破解检测)
BFD 是一个用于分析应用日志和检测验证失败的模块化shell 脚本
而且安装配置和用法都是非常容易的。使用BFD 的原因很简单。
其实在LINUX 领域几乎没有结合防火墙或实时设备来监控不验证和
暴力攻击审计的程序。在用BFD 之前你必须安装APF 防火墙。
LAMP 安全全攻略
方法:
wget http://www.r-fx.ca/downloads/bfd-current.tar.gz
tar -zxvf bfd-current.tar.gz
cd bfd-0.9
然后我们来配置它vi /usr/local/bfd/conf.bfd
把以下内容改为你的资料
# Enable/disable user alerts [0 = off; 1 = on]
ALERT_USR="1"
#
# User alert email address
EMAIL_USR="your@mail.com"
#
# User alert email; subject
SUBJ_USR="Brute Force Warning for $HOSTNAME"
#
然后vi /usr/local/bfd/ignore.hosts
把你的IP 设置成允许主机,避免意外的锁定自己。
之后重启BFD /usr/local/sbin/bfd -s
26.内核加固(sysctl.conf)
sysctl.conf 用来加固内核,目的是避免DOS 和欺骗攻击
方法:
到/proc/sys 目录或sysctl -a 命令了解下当前配置的大概情况
然后vi /etc/sysctl.conf
添加如下内容:
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1
#Prevent SYN attack
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# Disables packet forwarding
net.ipv4.ip_forward=0
LAMP 安全全攻略
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.lo.log_martians = 1
net.ipv4.conf.eth0.log_martians = 1
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
14
net.ipv4.conf.default.rp_filter = 1
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# Disables the magic-sysrq key
kernel.sysrq = 0
# Modify system limits for Ensim WEBppliance
fs.file-max = 65000
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 15
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# Turn off the tcp_window_scaling
LAMP 安全全攻略
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
# Set maximum amount of memory allocated to shm to 256MB
kernel.shmmax = 268435456
# Improve file system performance
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
# Improve virtual memory performance
vm.buffermem = 90 10 60
# Increases the size of the socket queue (effectively,q0).
net.ipv4.tcp_max_syn_backlog = 1024
# Increase the maximum total TCP buffer-space allocatable
net.ipv4.tcp_mem = 57344 57344 65536
# Increase the maximum TCP write-buffer-space allocatable
net.ipv4.tcp_wmem = 32768 65536 524288
15
# Increase the maximum TCP read-buffer space allocatable
net.ipv4.tcp_rmem = 98304 196608 1572864
# Increase the maximum and default receive socket buffer size
net.core.rmem_max = 524280
net.core.rmem_default = 524280
# Increase the maximum and default send socket buffer size
net.core.wmem_max = 524280
net.core.wmem_default = 524280
# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 1440000
# Allowed local port range
net.ipv4.ip_local_port_range = 16384 65536
# Increase the maximum memory used to reassemble IP fragments
net.ipv4.ipfrag_high_thresh = 512000
net.ipv4.ipfrag_low_thresh = 446464
# Increase the maximum amount of option memory buffers
net.core.optmem_max = 57344
# Increase the maximum number of skb-heads to be cached
LAMP 安全全攻略
net.core.hot_list_length = 1024
## DO NOT REMOVE THE FOLLOWING LINE!
## nsobuild:20051206
重启后生效
/sbin/sysctl -p
sysctl -w net.ipv4.route.flush=1
27.更改SSH端口
更改SSH 默认端口号在一定程度上可以提高安全性
方法:
vi /etc/ssh/sshd_config
Port 22 改为其他端口
当然不要忘记把更改的端口加进防火墙
然后重启生效/etc/init.d/ssh restart
如果安装了APF 并把端口添加之后,还要重启APF:/etc/init.d/apf restart
28./tmp,/var/tmp,/dev/shm分区的安全
/tmp,/var/tmp,/dev/shm 目录是不安全的,任何用户都可以执行脚本。
最好的解决办法是挂载ncexec 和nosuid 选项的参数
注意:不建议在CPanel 使用
方法:
/tmp 目录:
cd /dev
创建100M ("count") 的存储文件:
dd if=/dev/zero of=tmpMnt bs=1024 count=100000
设为一个扩展的文件系统:
/sbin/mke2fs /dev/tmpMnt ("...is not a block special device. continue?"回答yes)
备份现有临时文件:
cp -R /tmp/ /tmp_backup
用noexec 挂载新文件系统:
mount -o loop,rw,nosuid,noexec /dev/tmpMnt /tmp
chmod 0777 /tmp
把备份的文件拷贝回去:
cp -R /tmp_backup/* /tmp/
删除备份:
rm -rf /tmp_backup
修改/etc/fstab 添加下面的条目使其在引导时仍然有效
/dev/tmpMnt /tmp ext2 loop,rw,nosuid,noexec 0 0
/var/tmp 目录:
mv /var/tmp /var/tmpbak
ln -s /tmp /var/tmp
cp /var/tmpbak/* /tmp/
LAMP 安全全攻略
/dev/shm 目录:
编辑/etc/fstab
把none /dev/shm tmpfs defaults,rw 0 0
改为none /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0
apache方面
1.修改banner........................................................................................
2.修改默认的http 状态响应码404,503 等默认页面........................
3.Apache 的访问权限控制...............................................................
4.关闭危险指令................................................................................
5.open_basedir 限制目录...................................................................
6.掌握Apache 的Order Allow Deny 判断原则..............................
7.mod_rewrite 重写URL...................................................................
9.Speling 模块去除url 大小写..........................................................
8. Limit 模块限制IP 连接数...........................................................
9.让apache 支持安全HTTPS 协议................................................
10.安装配置mod_security................................................................
11.加载speling 模块.........................................................................
1.修改banner....................................................................................
1 编译源代码,修改默认的banner
ServerTokens ProductOnly
ServerSignature Off
在apache 的源码包中找到ap_release.h 将
#define AP_SERVER_BASEPRODUCT "Apache"
修改为
#define AP_SERVER_BASEPRODUCT "Microsoft-IIS/6.0”
os/unix 下的os.h 文件
#define PLATFORM "Unix"
修改为
#define PLATFORM "Win32“
2.Apache的访问权限控制
htpasswd -b -c /(存放密码文件路径)/.htpasswd username password
Alias /hack "/var/www/html/hack/"
<Directory "/var/www/html/hack">
LAMP 安全全攻略
authname "test"
authtype basic
authuserfile /var/www/html/hack/.htpasswd
require user kindle
</Directory>
3.关闭危险指令
清除FollowSymlinks 指令
关闭索引目录
Options Indexes FollowSymLinks
关闭CGI 执行程序
4.open_basedir 限制目录
用法:php_admin_value open_basedir /var/www
php_admin_value open_basedir 引起的上传文件失败解决方法
将上传文件的临时目录加入到php_admin_value open_basedir 后面,最后看起来是这样的:
<VirtualHost *:80>
php_admin_value open_basedir "/usr/local/apache/htdocs/www/:/tmp/"
</VirtualHost>
注意:两个目录之间是冒号隔开。
把PHP 脚本操作限制在web 目录可以避免程序员使用copy 函数把系统文件拷贝到web 目录。
move_uploaded_file 不受open_basedir 的限制,所以不必修改php.ini 里upload_tmp_dir 的值。
5.掌握Apache的OrderAllowDeny 判断原则
1. 首先判断默认的;
2. 然后判断逗号前的;
3. 最后判断逗号后的;
4. 最终按顺序叠加而得出判断结果。
ex:
apache 的php 扩展名解析漏洞
<Files ~ "\.(php.|php3.)">
Order Allow,Deny
Deny from all
</Files>
apache 设置上传目录无执行权限
<Directory "/www/home/upload">
<Files ~ ".php">
Order allow,deny
Deny from all
</Files>
</Directory>
LAMP 安全全攻略
6.mod_rewrite重写URL请求的引擎
重写规则的作用范围
1.使用在Apache 主配置文件httpd.conf 中。
2.使用在httpd.conf 里定义的配置中。
3.使用在基本目录的跨越配置文件.htaccess 中。
1.url 重定向80 到443 端口
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/?(.*)$ https://www.kindle.com/$1 [L,R]
含义是这样的:为了让用户访问传统的http://转到https://上来,用了一下rewrite 规则:
第一句:启动rewrite 引擎
第二句:rewrite 的条件是访问的服务器端口不是443 端口
第三句:这是正则表达式,^是开头,$是结束,/?表示有没有/都可以(0 或1 个),(.*)是任何数量的任意字
符
整句的意思是讲:启动rewrite 模块,将所有访问非443 端口的请求,url 地址内容不变,将http://变成https://
7.Speling模块去除url大小写
确认speling 模块存在并已加载
启动speling
<Directory "/usr/local/downloads">
CheckSpelling .
AllowOverride None
Order allow,deny
Allow from all
</Directory>
8.Limit模块限制IP连接数
下载模块http://dominia.org/djao/limit/mod_limitipconn-0.04.tar.gz
安装:
tar zxvf mod_limitipconn-0.04.tar.gz
cd mod_limitipconn-0.04
make APXS=/usr/local/apache/bin/apxs ß-----这里要按你自己的路径设置
make install APXS=/usr/local/apache/bin/apxs ß-----这里要按你自己的路径设置
编辑httpd.conf
添加
全局变量:
< IfModule mod_limitipconn.c >
< Location / > # 所有虚拟主机的/目录
MaxConnPerIP 3 # 每IP 只允许3 个并发连接
LAMP 安全全攻略
NoIPLimit p_w_picpath/* # 对图片不做IP 限制
< /Location >
< Location /mp3 > # 所有主机的/mp3 目录
MaxConnPerIP 1 # 每IP 只允许一个连接请求
OnlyIPLimit audio/mpeg video # 该限制只对视频和音频格式的文件
< /Location >
< /IfModule >
9.让服务器支持安全HTTPS 协议:
yum -y install mod_ssl
cd /etc/httpd/conf 进入HTTP 服务器配置文件所在目录
rm -rf ssl.*/server.* 删除默认或残留的服务器证书相关文件
rpm -qa |grep openssl
openssl genrsa -out www.kindle.com.key 1024 建立服务器密钥
openssl req -new –key www.kindle.com.key -out www.kindle.com.csr 建立服务器公钥
openssl x509 -req -days 365 -in www.kindle.com.csr -signkey www.kindle.com.key -out www.kindle.com.crt
建立服务器证书
/etc/rc.d/init.d/httpd restart 重启服务
netstat -ntpl |grep 443
10.安装mod_security:
下载:http://www.modsecurity.org/download/modsecurity-1.8.7.tar.gz
http://fedoranews.org/jorge/mod_security/mod_security.conf
安装:下载到/opt/soft 目录下。
# tar –zxvf modsecurity-1.8.7.tar.gz
# cd modsecurity-1.8.7
#cd apache2
# /opt/apache/bin/ apxs -cia mod_security.c
#copy mod_security.conf /opt/apache/conf
配置:
在/opt/apache/conf/httpd.conf 中添加下面一行:
Include conf/mod_security.conf
/opt/apache/bin/apachectl stop
/opt/apache/bin/apachectl startssl
更详细的mod_security 的配置
http://www.modsecurity.org/documentation/modsecurity-apache/1.9.3/html-multipage/index.html
Php方面
1 打开php 的安全模式...............................................................
2 安全模式下执行程序主目录...............................................
3 安全模式下包含文件.............................................................
4 控制php 脚本能访问的目录...............................................
5 关闭危险函数.........................................................................
LAMP 安全全攻略
6 关闭PHP 版本信息在http 头中的泄漏...............................
7 关闭注册全局变量.............................................................
8 打开magic_quotes_gpc 来防止SQL 注入.........................
9 错误信息控制.....................................................................
10 错误日志...........................................................................
关闭远程文件打开
Php.ini 包含补丁文件
1.打开php的安全模式
php 的安全模式是个非常重要的内嵌的安全机制,能够控制一些php 中的函数,比如system(),同时把很多
文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd 但是默认的php.ini 是没
有打开安全模式的,我们把它打开:safe_mode = on
当safe_mode 打开时,safe_mode_gid 被关闭,那么php 脚本能够对文件进行访问,而且相同组的用户也能
够对文件进行访问。建议设置为:safe_mode_gid = off
如果不进行设置,可能我们无法对我们服务器网站目录下的文件进行操作了,比如我们需要对文件进行操
作的时候。
2.安全模式下执行程序主目录
如果安全模式打开了,但是却是要执行某些程序的时候,可以指定要执行程序的主目录:safe_mode_exec_dir
= D:/usr/bin
一般情况下是不需要执行什么程序的,所以推荐不要执行系统程序目录,可以指向一个目录,然后把需要
执行的程序拷贝过去,比如:safe_mode_exec_dir = D:/tmp/cmd
但是,我更推荐不要执行任何程序,那么就可以指向我们网页目录:
safe_mode_exec_dir = D:/usr/www
3.安全模式下包含文件
如果要在安全模式下包含某些公共文件,那么就修改一下选项:
safe_mode_include_dir = D:/usr/www/include/
其实一般php 脚本中包含文件都是在程序自己已经写好了,这个可以根据具体需要设置。
4.控制php脚本能访问的目录
使用open_basedir 选项能够控制PHP 脚本只能访问指定的目录,这样能够避免PHP 脚本访问.不应该访问
的文件,一定程度上限制了phpshell 的危害,我们一般可以设置为只能访问网站目录:
open_basedir = /var/www/html
5.关闭危险函数
如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得
不希望执行包括system()等在那的能够执行命令的php 函数,或者能够查看php 信息的phpinfo()等函数,
那么我们就可以禁止它们:
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作
disable_functions =disable_functions = system, show_source, symlink, exec, dl,
LAMP 安全全攻略
shell_exec, passthru, phpinfo, escapeshellarg,escapeshellcmd
以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,
就能够抵制大部分的phpshell 了。
注:disable_classes 可以禁用某些类,如果有多个用逗号分隔类名
6.关闭PHP 版本信息在http头中的泄漏
我们为了防止黑客获取服务器中php 版本的信息,可以关闭该信息斜路在http 头中:
expose_php = Off
比如黑客在telnet www.12345.com 80 的时候,那么将无法看到PHP 的信息。
7.关闭注册全局变量
在PHP 中提交的变量,包括使用POST 或者GET 提交的变量,都将自动注册为全局变量,能够直接访问,
这是对服务器非常不安全的,所以我们不能让它注册为全局变量,就把注册全局变量选项关闭:
register_globals = Off
当然,如果这样设置了,那么获取对应变量的时候就要采用合理方式,比如获取GET 提交的变量var,那
么就要用$_GET['var']来进行获取,这个php 程序员要注意。
8.打开magic_quotes_gpc来防止SQL注入
SQL 注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。php.ini 中有
一个设置:
magic_quotes_gpc = Off
这个默认是关闭的,如果它打开后将自动把用户提交对sql 的查询进行转换,比如把' 转为\'等,这对防
止sql 注射有重大作用。所以我们推荐设置为:
magic_quotes_gpc = On
9.错误信息控制
一般php 在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含php 脚本当前的路径
信息或者查询的SQL 语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建议禁止错误提
示:
display_errors = Off
如果你却是是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息:
error_reporting = E_WARNING & E_ERROR
当然,我还是建议关闭错误提示。
10.错误日志
建议在关闭display_errors 后能够把错误信息记录下来,便于查×××器运行的原因:
LAMP 安全全攻略
log_errors = On
同时也要设置错误日志存放的目录,建议根apache 的日志存在一起:
error_log = D:/usr/local/apache2/logs/php_error.log
注意:给文件必须允许apache 用户的和组具有写的权限。
12.php.ini包含补丁文件
在php.ini 中引用。在配置文件内引用的话,将影响到所以的网站,包含所有页面
在php.ini 中,找到此节:
; Automatically add files before or after any PHP document.
;auto_prepend_file = "phpids.php"
;auto_append_file = "alert.php"
默认是空,请添加所包含的文件。同时找到:
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
include_path = ".;F:\PHPnow\htdocs"
mysql方面
1.修改root 用户口令,删除空口令...............................................................................
2.删除默认数据库和数据库用户..................................................................................
3.改变默认mysql 管理员帐号..................................................................................
4.关于密码的管理.....................................................................................................
5.使用独立用户运行msyql ........................................................................................
6.禁止远程连接数据库..............................................................................................
7.限制连接用户的数量............................................................................................
8.用户目录权限限制................................................................................................
9.命令历史记录保护...................................................................................................
10.禁止MySQL 对本地文件存取............................................................................
11.MySQL 服务器权限控制.....................................................................................
12.使用chroot 方式来控制MySQL 的运行目录...................................................
13.关闭对无关的Web 程序访问的支持...............................................................
14.数据库备份策略..............................................................................................
15. Mysqld 安全相关启动选项............................................................................
16.information_schema 安全...............................................................................
1.修改root用户口令,删除空口令
LAMP 安全全攻略
缺省安装的MySQL 的root 用户是空密码的,为了安全起见,必须修改为强密码,所谓的强密码,至少8
位,由字母、数字和符号组成的不规律密码。使用MySQL 自带的命令mysaladmin 修改root 密码,同时也
可以登陆数据库,修改数据库mysql 下的user 表的字段内容,修改方法如下所示:
# /usr/local/mysql/bin/mysqladmin -u root password “upassword” //使用mysqladmin
#mysql> use mysql;
#mysql> update user set password=password('upassword') where user='root';
#mysql> flush privileges; //强制刷新内存授权表,否则用的还是在内存缓冲的口令
2.删除默认数据库和数据库用户
一般情况下,MySQL 数据库安装在本地,并且也只需要本地的php 脚本对mysql 进行读取,所以很多用户
不需要,尤其是默认安装的用户。MySQL 初始化后会自动生成空用户和test 库,进行安装的测试,这会对
数据库的安全构成威胁,有必要全部删除,最后的状态只保留单个root 即可,当然以后根据需要增加用户
和数据库。
#mysql> show databases;
#mysql> drop database test; //删除数据库test
#use mysql;
#delete from db; //删除存放数据库的表信息,因为还没有数据库信息。
#mysql> delete from user where not (user='root') ; // 删除初始非root 的用户
#mysql> delete from user where user='root' and password=''; //删除空密码的root,尽量重复操作
Query OK, 2 rows affected (0.00 sec)
#mysql> flush privileges; //强制刷新内存授权表。
4.关于密码的管理
密码是数据库安全管理的一个很重要因素,不要将纯文本密码保存到数据库中。如果你的计算机有安全危
险,入侵者可以获得所有的密码并使用它们。相反,应使用MD5()、SHA1()或单向哈希函数。也不要从词
典中选择密码,有专门的程序可以破解它们,请选用至少八位,由字母、数字和符号组成的强密码。在存
取密码时,使用mysql 的内置函数password()的sql 语句,对密码进行加密后存储。例如以下方式在users
表中加入新用户。
#mysql> insert into users values (1,password(1234),'test');
5.使用独立用户运行msyql
绝对不要作为使用root 用户运行MySQL 服务器。这样做非常危险,因为任何具有FILE 权限的用户能够用
root 创建文件(例如,~root/.bashrc)。mysqld 拒绝使用root 运行,除非使用--user=root 选项明显指定。应该
用普通非特权用户运行mysqld。正如前面的安装过程一样,为数据库建立独立的linux 中的mysql 账户,
该账户用来只用于管理和运行MySQL。
要想用其它Unix 用户启动mysqld,,增加user 选项指定/etc/my.cnf 选项文件或服务器数据目录的my.cnf 选
项文件中的[mysqld]组的用户名。
#vi /etc/my.cnf
[mysqld]
LAMP 安全全攻略
user=mysql
该命令使服务器用指定的用户来启动,无论你手动启动或通过mysqld_safe 或mysql.server 启动,都能确保
使用mysql 的身份。也可以在启动数据库是,加上user 参数。
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
作为其它linux 用户而不用root 运行mysqld,你不需要更改user 表中的root 用户名,因为MySQL 账户的
用户名与linux 账户的用户名无关。确保mysqld 运行时,只使用对数据库目录具有读或写权限的linux 用户
来运行。
6.禁止远程连接数据库
在命令行netstat -ant 下看到,默认的3306 端口是打开的,此时打开了mysqld 的网络监听,允许用户远程
通过帐号密码连接数本地据库,默认情况是允许远程连接数据的。为了禁止该功能,启动skip-networking,
不监听sql 的任何TCP/IP 的连接,切断远程访问的权利,保证安全性。假如需要远程管理数据库,可通过
安装PhpMyadmin 来实现。假如确实需要远程连接数据库,至少修改默认的监听端口,同时添加防火墙规
则,只允许可信任的网络的mysql 监听端口的数据通过。
# vi /etc/my.cf
将#skip-networking 注释去掉。
# /usr/local/mysql/bin/mysqladmin -u root -p shutdown //停止数据库
#/usr/local/mysql/bin/mysqld_safe --user=mysql & //后台用mysql 用户启动mysql
7.限制连接用户的数量
数据库的某用户多次远程连接,会导致性能的下降和影响其他用户的操作,有必要对其进行限制。可以通
过限制单个账户允许的连接数量来实现,设置my.cnf 文件的mysqld 中的max_user_connections 变量来完成。
GRANT 语句也可以支持资源控制选项来限制服务器对一个账户允许的使用范围。
#vi /etc/my.cnf
[mysqld]
max_user_connections 2
8.用户目录权限限制
默认的mysql 是安装在/usr/local/mysql,而对应的数据库文件在/usr/local/mysql/var 目录下,因此,必须保证
该目录不能让未经授权的用户访问后把数据库打包拷贝走了,所以要限制对该目录的访问。确保mysqld 运
行时,只使用对数据库目录具有读或写权限的linux 用户来运行。
# chown -R root /usr/local/mysql/ //mysql 主目录给root
# chown -R mysql.mysql /usr/local/mysql/var //确保数据库目录权限所属mysql 用户
9.命令历史记录保护
数据库相关的shell 操作命令都会分别记录在.bash_history,如果这些文件不慎被读取,会导致数据库密码
和数据库结构等信息泄露,而登陆数据库后的操作将记录在.mysql_history 文件中,如果使用update 表信息
来修改数据库用户密码的话,也会被读取密码,因此需要删除这两个文件,同时在进行登陆或备份数据库
等与密码相关操作时,应该使用-p 参数加入提示输入密码后,隐式输入密码,建议将以上文件置空。
# rm .bash_history .mysql_history //删除历史记录
LAMP 安全全攻略
# ln -s /dev/null .bash_history //将shell 记录文件置空
# ln -s /dev/null .mysql_history //将mysql 记录文件置空
10.禁止MySQL对本地文件存取
在mysql 中,提供对本地文件的读取,使用的是load data local infile 命令,默认在5.0 版本中,该选项是默
认打开的,该操作令会利用MySQL 把本地文件读到数据库中,然后用户就可以非法获取敏感信息了,假
如你不需要读取本地文件,请务必关闭。应该禁止MySQL 中用“LOAD DATA LOCAL INFILE”命令。网络
上流传的一些攻击方法中就有用它LOAD DATA LOCAL INFILE 的,同时它也是很多新发现的SQL Injection
攻击利用的手段!黑客还能通过使用LOAD DATALOCAL INFILE 装载“/etc/passwd”进一个数据库表,然后
能用SELECT 显示它,这个操作对服务器的安全来说,是致命的。可以在my.cnf 中添加local-infile=0,或
者加参数local-infile=0 启动mysql。
#/usr/local/mysql/bin/mysqld_safe --user=mysql --local-infile=0 &
#mysql> load data local infile 'sqlfile.txt' into table users fields terminated by ',';
#ERROR 1148 (42000): The used command is not allowed with this MySQL version
--local-infile=0 选项启动mysqld 从服务器端禁用所有LOAD DATA LOCAL 命令,假如需要获取本地文件,
需要打开,但是建议关闭。
11.MySQL服务器权限控制
MySQL 权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、
INSERT、UPDATE 和DELETE 等权限(详见user 超级用户表)。它的附加的功能包括有匿名的用户并对于
MySQL 特定的功能例如LOAD DATA INFILE 进行授权及管理操作的能力。
管理员可以对user,db,host 等表进行配置,来控制用户的访问权限,而user 表权限是超级用户权限。只
把user 表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,你应该把在user 表中的权限
设成'N'并且仅在特定数据库的基础上授权。你可以为特定的数据库、表或列授权,FILE 权限给予你用LOAD
DATA INFILE 和SELECT ... INTO OUTFILE 语句读和写服务器上的文件,任何被授予FILE 权限的用户都
能读或写MySQL 服务器能读或写的任何文件。(说明用户可以读任何数据库目录下的文件,因为服务器可
以访问这些文件)。FILE 权限允许用户在MySQL 服务器具有写权限的目录下创建新文件,但不能覆盖已
有文件在user 表的File_priv 设置Y 或N。,所以当你不需要对服务器文件读取时,请关闭该权限。
#mysql> load data infile 'sqlfile.txt' into table loadfile.users fields terminated by ',';
Query OK, 4 rows affected (0.00 sec) //读取本地信息sqlfile.txt'
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
#mysql> update user set File_priv='N' where user='root'; //禁止读取权限
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges; //刷新授权表
Query OK, 0 rows affected (0.00 sec)
#mysql> load data infile 'sqlfile.txt' into table users fields terminated by ','; //重登陆读取文件
#ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) //失败
# mysql> select * from loadfile.users into outfile 'test.txt' fields terminated by ',';
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
为了安全起见,随时使用SHOW GRANTS 语句检查查看谁已经访问了什么。然后使用REVOKE 语句删除
LAMP 安全全攻略
不再需要的权限。
12.使用chroot方式来控制MySQL 的运行目录
Chroot 是linux 中的一种系统高级保护手段,它的建立会将其与主系统几乎完全隔离,也就是说,一旦遭到
什么问题,也不会危及到正在运行的主系统。这是一个非常有效的办法,特别是在配置网络服务程序的时
候。
13.关闭对Web访问的支持
如果不打算让Web 访问使用MySQL 数据库,没有提供诸如PHP 这样的Web 语言的时候,重新设置或编
译你的PHP,取消它们对MySQL 的默认支持。假如服务器中使用php 等web 程序,试试用Web 形式非法
的请求,如果得到任何形式的MySQL 错误,立即分析原因,及时修改Web 程序,堵住漏洞,防止MySQL
暴露在web 面前。
对于Web 的安全检查,在MySQL 官方文档中这么建议,对于web 应用,至少检查以下清单:
? 试试用Web 形式输入单引号和双引号(‘'’和‘"’)。如果得到任何形式的MySQL 错误,立即分析原因。
? 试试修改动态URL,可以在其中添加%22(‘"’)、%23(‘#’)和%27(‘'’)。
? 试试在动态URL 中修改数据类型,使用前面示例中的字符,包括数字和字符类型。你的应用程序应足
够安全,可以防范此类修改和类似攻击。
? 试试输入字符、空格和特殊符号,不要输入数值字段的数字。你的应用程序应在将它们传递到MySQL
之前将它们删除或生成错误。将未经过检查的值传递给MySQL 是很危险的!
? 将数据传给MySQL 之前先检查其大小。
? 用管理账户之外的用户名将应用程序连接到数据库。不要给应用程序任何不需要的访问权限。
14.数据库备份策略
使用mysqldump 进行备份非常简单,如果要备份数据库” nagios_db_backup ”,使用命令,同时使用管道gzip
命令对备份文件进行压缩,建议使用异地备份的形式,可以采用Rsync 等方式,将备份服务器的目录挂载
到数据库服务器,将数据库文件备份打包在,通过crontab 定时备份数据:
#!/bin/sh
time=`date +"("%F")"%R`
$/usr/local/mysql/bin/mysqldump -u nagios -pnagios nagios | gzip
>/home/sszheng/nfs58/nagiosbackup/nagios_backup.$time.gz
# crontab -l
# m h dom mon dow command
00 00 * * * /home/sszheng/shnagios/backup.sh
恢复数据使用命令:
gzip -d nagios_backup.\(2008-01-24\)00\:00.gz
nagios_backup.(2008-01-24)00:00
#mysql –u root -p nagios < /home/sszheng/nfs58/nagiosbackup/nagios_backup.\(2008-01-24\)12\:00
15.Mysqld 安全相关启动选项
? --local-infile[={0|1}]
LAMP 安全全攻略
如果用--local-infile=0 启动服务器,则客户端不能使用LOCAL in LOAD DATA 语句。
? --old-passwords
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这
很有用。
? (OBSOLETE) --safe-show-database
在以前版本的MySQL 中,该选项使SHOW DATABASES 语句只显示用户具有部分权限的数据库名。在
MySQL 5.1 中,该选项不再作为现在的默认行为使用,有一个SHOW DATABASES 权限可以用来控制每
个账户对数据库名的访问。
? --safe-user-create
如果启用,用户不能用GRANT 语句创建新用户,除非用户有mysql.user 表的INSERT 权限。如果你想让
用户具有授权权限来创建新用户,你应给用户授予下面的权限:
mysql> GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';
这样确保用户不能直接更改权限列,必须使用GRANT 语句给其它用户授予该权限。
? --secure-auth
不允许鉴定有旧(pre-4.1)密码的账户。
16.information_schema 安全
在用户角度来看,INFORMATION_SCHEMA 只是一个以插件方式存在的存储引擎,编译安装的时候
--disable-information-schema 就行了
added TRIGGER_ACL check for I_S.TRIGGERS
http://bugs.mysql.com/bug.php?id=38837
http://bugs.mysql.com/bug.php?id=27629
Phpmyadmin 里隐藏方法
$cfg['servers'][$i]['hide_db'] = 'information_schema';
Iptables 方面:
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP