本博自豪的采用PHP7。 PHP是世界上最好的语言,没有之一。

LAMP 安全全攻略

领域深入 admin 2890次浏览 已收录 1个评论 扫描二维码

 

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 image/* # 对图片不做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:PHPnowhtdocs"

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


pitata技术乐园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明LAMP 安全全攻略
喜欢 (1)
[103531948@qq.com]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. test

    admin2012-11-29 19:02 回复