4年前给法客论坛加固的方案

2018-02-03 浏览:
4年前给法客论坛加固的方案
评论(1)复制地址

希望对做:运维,安服,还有各位站长有些用。

括号内的备注说明

不适用:表示这种加固手法对我们不适合,不需要配置
可选:表示这种加固手法暂时不需要做,等以后有需要的时候再做。
已完成:表示这种加固手法已经完成
Linux使用较高稳定版的SSH(已完成)
ssh  v1存在缺陷,不能使用这个版本的,应该使用SSH V2。
编辑sshd_config,把协议改为
重启SSH服务。
更改SSH默认端口为5080(已完成)
默认的22端口容易受到共计,建议更改SSH默认端口为5080
Vi /etc/ssh/sshd_config
禁止root远程登录(已完成)
新增可登录普通账户:
账户
密码
f4ck
hellokitty!@#)(*
root
hynoqCk9123123
平时普通操作使用这个普通账户,如果需要使用root,使用su命令切换即可。
禁用root远程登陆的方法:
编辑sshd_config:
PermitRootLogin = no
重启SSH服务。
禁用所有特殊账户(已完成)
应该从系统中删除所有默认用户和组
例如 news,lp,sync,shutdown,uucp,games,halt 等
方法:
删除账户 userdel name
删除组 groupdel name
锁定特定账户: /usr/sbin/usermod -L -s /bin/false user
目前状况:
删除风险账户,保留账户权限确认为nologin/flase的,已经确认无风险:
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
distcache:x:94:94:Distcache:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
dovecot:x:97:97:dovecot:/usr/libexec/dovecot:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:4294967294:4294967294:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
qemu:x:100:102:qemu user:/:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
avahi-autoipd:x:101:103:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
f4ck:x:500:500::/home/f4ck:/bin/bash
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false
启用强制密码长度策略(已完成)
14. 14. 14. 14. 选择一个安全的密码
在 /etc/login.defs 文件中定义了 shadow 密码的具体配置
默认密码长度最短为 5 字符,你应该至少设置为13
方法:
vi /etc/login.defs
PASS_MIN_LEN 13
关闭不用的服务(已完成)
应该把任何未使用的服务关闭,可以在 /etc/xinetd.d 文件夹里找到
方法:
cd /etc/xinetd.d
grep disable *
这将显示所有服务开启或关闭的状态,然后根据需要来开启或关闭服务
现状:
[root@serverp60111305150001 ~]# chkconfig  --list | grep 3:on
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
anacron         0:off   1:off   2:on    3:on    4:on    5:on    6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
irqbalance      0:off   1:off   2:on    3:on    4:on    5:on    6:off
iscsi           0:off   1:off   2:off   3:on    4:on    5:on    6:off
iscsid          0:off   1:off   2:off   3:on    4:on    5:on    6:off
kudzu           0:off   1:off   2:off   3:on    4:on    5:on    6:off
libvirt-guests  0:off   1:off   2:off   3:on    4:on    5:on    6:off
libvirtd        0:off   1:off   2:off   3:on    4:on    5:on    6:off
lvm2-monitor    0:off   1:on    2:on    3:on    4:on    5:on    6:off
mcstrans        0:off   1:off   2:on    3:on    4:on    5:on    6:off
mdmonitor       0:off   1:off   2:on    3:on    4:on    5:on    6:off
microcode_ctl   0:off   1:off   2:on    3:on    4:on    5:on    6:off
netfs           0:off   1:off   2:off   3:on    4:on    5:on    6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
rawdevices      0:off   1:off   2:off   3:on    4:on    5:on    6:off
readahead_early 0:off   1:off   2:on    3:on    4:on    5:on    6:off
restorecond     0:off   1:off   2:on    3:on    4:on    5:on    6:off
sendmail        0:off   1:off   2:on    3:on    4:on    5:on    6:off
setroubleshoot  0:off   1:off   2:off   3:on    4:on    5:on    6:off
smartd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
syslog          0:off   1:off   2:on    3:on    4:on    5:on    6:off
xfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
xinetd          0:off   1:off   2:off   3:on    4:on    5:on    6:off
检测监听的端口(已完成)
检测是否有必要开放端口是非常重要的
方法:
netstat -tulp 或
lsof -i -n | egrep 'COMMAND|LISTEN|UDP' 或使用nmap
[root@serverp60111305150001 ~]# netstat -apn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  
tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN      2758/dnsmasq        
tcp        0      0 0.0.0.0:5080                0.0.0.0:*                   LISTEN      2402/sshd          
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2450/sendmail: acce
tcp        0    300 10.4.1.97:5080              218.108.255.181:64026       ESTABLISHED 2794/sshd: f4ck [pr
udp        0      0 192.168.122.1:53            0.0.0.0:*                               2758/dnsmasq        
udp        0      0 0.0.0.0:67                  0.0.0.0:*                               2758/dnsmasq        
udp        0      0 0.0.0.0:68                  0.0.0.0:*                               2198/dhclient  
history命令增加时间戳(已完成)
默认情况下history命令的存储格式中是不带时间戳的,可以为history命令增加时间戳,方便事件回溯追踪。
禁用图形界面(已完成)
系统默认是以图形界面启动的:
这样会占用大量的系统资源,需禁用图形界面。
Inittab操作为3,通过runlevel 查看。
启用登录警示信息
登录警示信息只在本地登录的时候有效,远程登录不显示。
警示信息设置为:
If you are not an administrator, please do not log in and leave, otherwise we will retain the power to pursue legal responsibilities.
必须提供一些信息让攻击者知道该系统不对公众开放。
在国外有类似案件,攻击者入侵一个系统并且系统没有这些信息,这种情况下法院不能做任何裁决,因为系统说 welcome
方法:
删除 /etc/redhat-release
vi编辑 /etc/issue /etc/motd 并显示警告信息
启用root登录邮件通知
这个还是做一下,这样保险点。
邮件接收邮箱:f4ckteam@139.com
当一个具有 root 权限的用户登录的时候发 mail
方法:
vi编辑 /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
启用selinux控制目录/文件访问权限(最后做)
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现。SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制(MAC)系统。对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的。
定时进行数据备份(最后做)
使用rsync,每周对网站文件和数据库进行全量备份打包到本地磁盘。
查看内存和CPU占用情况
top
free
Ps -aux
Apache
版本:httpd-2.2.3-78.el5.centos
设置管理端口为非常规端口
Apache的管理端口不能是8080等常规端口,可以酌情设置为8889端口。
域名绑定
域名
目录
系统账户
账户密码
www.f4ck.org
/home/wwwfjodisgj9qh83yugurj
www
lgqj981thguejdgf8yqg
bbs.f4ck.org
/home/ wwwfjodisgj9qh83yugurj
www
lgqj981thguejdgf8yqg
xue.f4ck.org
/home/xuedsfjopqogju9jgoids
xue
kj87r4drftugd6ikm
也就是www.f4ck.orgbbs.f4ck.org都指向到/home/wwwfjodisgj9qh83yugurj目录下,配置apache的时候也很简单,编辑httpd-vhosts.conf,添加一行ServerAlias语句设置个别名即可:
<VirtualHost *:80>
   ServerAdmin drvfan@qq.com
   DocumentRoot "/home/wwwfjodisgj9qh83yugurj"
   ServerName www.f4ck.org
   ServerAlias bbs.f4ck.org
   ErrorLog "logs/www.f4ck.org-error.log"
   CustomLog "logs/www.f4ck.org-access.log" common
</VirtualHost>
如果ServerAlias后要跟的域名不止一个,那么各个域名之间用空格隔开即可,比如:
ServerAlias bbs.f4ck.org sb.f4ck.org
ServerAlias也可以使用星号*来绑定泛解析的域名,语法格式为:
ServerAlias *.f4ck.org
apache使用专门的用户与组
按照最小特权的原则,需要给apache分配一个合适的权限,让其能够完成web服务。最小特权原则是系统安全中最基本的原则之一,限制使用者对系统及数据进行存取所需要的最小权限,保证用户可以完成任务,同时也确保被窃取或异常操作所造成的损失。
Ø 创建低权限的独立用户www来运行apache服务,不能是root级别的权限,最好配置为nologin,这个用户只为www.f4ck.org提供服务,用户密码:lgqj981thguejdgf8yqg
Ø 创建低权限的独立用户bbs来运行apache服务,不能是root级别的权限,最好配置为nologin,这个用户只为bbs.f4ck.org提供服务,用户密码:shf8tgujredksjfg9284hyfd
Ø 独立用户www和独立用户bbs这2个用户属于用户组f4ckwebuser,权限配置是一样的,都是低权限,仅可用来启动apache即可,不需要其他的任何权限
禁止Apache访问Web目录之外的任何文件
编辑 httpd.conf配置文件,修改为:
<Directory />
Order Deny,Allow
Deny from all
</Directory>
如果apache必须要访问web目录以外的目录或文件,可以设置可访问目录,
<Directory /web>
Order Allow,Deny
Allow from all
</Directory>
其中/web为网站根目录。
防止apache列目录
(1) 编辑httpd.conf配置文件,
<Directory "/web">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
将Options Indexes FollowSymLinks中的Indexes去掉,就可以禁止Apache显示该目录结构。Indexes的作用就是当该目录下没有index.html文件时,就显示目录结构。
(2)设置 Apache 的默认页面,编辑%apache%\conf\httpd.conf配置文件,
<IfModule dir_module>
       DirectoryIndex index.html
</IfModule>
其中index.html即为默认页面,可根据情况改为其它文件。
(3)重新启动 Apache 服务
隐藏网页上的Apache签名
Apache签名:
修改extra/httpd-default.conf中的ServerSignature为off。
隐藏签名后的效果:
隐藏HTTP响应头部的apache签名
例如:
Server: Apache/2.2.3 (CentOS) Server at xxxxxxx Port 80
修改extra/httpd-default.conf中的ServerTokens的值设为Prod
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod
隐藏签名后的效果:
伪造默认错误页面
此项可使用.htacess单独控制。
ErrorDocument 400 /xxoo.htm
ErrorDocument 401 /xxoo.htm
ErrorDocument 402 /xxoo.htm
ErrorDocument 403 /xxoo.htm
ErrorDocument 404 /xxoo.htm
ErrorDocument 405 /xxoo.htm
ErrorDocument 406 /xxoo.htm
ErrorDocument 407 /xxoo.htm
ErrorDocument 408 /xxoo.htm
ErrorDocument 409 /xxoo.htm
ErrorDocument 410 /xxoo.htm
ErrorDocument 411 /xxoo.htm
ErrorDocument 412 /xxoo.htm
ErrorDocument 413 /xxoo.htm
ErrorDocument 414 /xxoo.htm
ErrorDocument 500 /xxoo.htm
ErrorDocument 501 /xxoo.htm
ErrorDocument 502 /xxoo.htm
ErrorDocument 503 /xxoo.htm
ErrorDocument 504 /xxoo.htm
ErrorDocument 505 /xxoo.htm
也可以修改httpd.conf配置文件添加以上代码并重新启动 Apache 服务生效。
删除缺省安装的无用文件
删除apache默认安装的无用文件:
htdocs
cgi-bin
manual
只允许apache解析php文件
只允许apache解析php文件,禁止解析php3/php4/php5等扩展名的文件。
Mysql
版本:mysql-server-5.0.95-5.el5_9
权限控制
账户
密码
权限
登录
root
sdjf9qhgudakjgqJFQ098TYG9URJds
禁用file权限
仅限localhost
bbsread
fji2out8jqiurehgiajdig
bbsreadfsdoj
禁用file权限
禁止新建库
仅限localhost
账户安全
权限需求:
select, insert, update, delete, alter, create, index
用户授权方法
创建用户并仅限本地登录:
CREATE USER 'uclass'@'localhost' IDENTIFIED BY '123';
注:如果要允许远程登录,则将上述语句中的localhost改为%
比如设置mysql账户testf对数据库datafselectinsertupdatedelete权限,但没有drop权限,则执行SQL语句:
GRANT selectinsertupdatedelete ON DATAF TO testf@"localhost";
注:如果要赋予某用户对某库的所有控制权,则语句为:
GRANT ALL PRIVILEGES ON DATAF TO testf@"localhost";
如果有必要,可以先清空授权:
REVOKE all on DATAF from testf;
再添加授权。
最后重载授权表:
FLUSH PRIVILEGES;
也可以适用GRANT语句直接新建mysql账户并完成指定数据库的授权,比如创建一个test用户,密码为test,并且只能对picture数据库进行操作:
GRANT ALL ON picture.* TO test IDENTIFIED BY "test";
MYSQL权限详细分类
全局管理权限:
FILE: MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(root一样)
USAGE: 只允许登录--其它什么也不允许做。
禁止远程登录
限制所有的mysql账户都只能在localhost登录,禁止远程登录。
update mysql.user set HOST='localhost'
禁用file权限
禁用所有mysql账户的file权限。
root权限登录数据库,执行SQL
UPDATE mysql.user SET File_priv = 'N';
这样的话就是影响全局的,也就是所有的mysql账户都没有了file权限。
如果要禁止单个用户的file权限,在上述语句中跟上where子句即可:
UPDATE mysql.user SET File_priv = 'N'; WHERE USER='root'
只有root可以新建/删除库,禁用其他mysql账户新建/删除库的权限。
禁止将process或super权限赋给非管理员用户。
使用mysql_secure_installation配置安全的mysql
mysql安装完毕之后,会有个提示:
Preparing...                ########################################### [100%]
  1:MySQL-server           ########################################### [100%]
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'
Alternatively you can run:
/usr/bin/mysql_secure_installation
这里的意思就是你可以选择以上的3种方式给root账户设置一个密码,作者推荐使用mysql_secure_installation来完成这个事情。
执行mysql_secure_installation:
[root@localhost Desktop]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
     SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):  
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
You already have a root password set, so you can safely answer 'n'.
Change the root password? [Y/n] n
... skipping.
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n
... skipping.
By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] n
... skipping.
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
也就是说,mysql安装完成后,可以使用mysql_secure_installation来完成:
Ø root设置密码
Ø 删除anonymous匿名账户
Ø 禁止root远程登录,限制为只能本地登录
Ø 删除test库并刷新用户对该库的授权
Ø 强制刷新授权表
删除mysql默认的账户和库
删除mysql安装时默认具备的无用账户。
删除mysql安装时默认具备的test库。
修改默认mysql管理员帐号
系统mysql的管理员名称是root,而一般情况下,数据库管理员都没进行修改,这一定程度上对系统用户穷举的恶意行为提供了便利,此时修改为复杂的用户名,请不要在设定为admin或者administraror的形式,因为它们也在易猜的用户字典中。
执行:
mysql> update user set user="fsjojgof4ck" where user="root"; //改成不易被猜测的用户名
mysql> flush privileges; //强制刷新内存授权表
防止跨库(没用)
如果有多个数据库,每个数据库有一个用户,那么必须限制用户浏览其他数据库内容,可以在启动MySQL服务器时加--skip-show-database启动参数就能够达到目的。
编辑my.cf
添加--skip-show-database语句
禁用load_file
编辑my.cf
添加set-variable=local-infile = 0
限制user表的访问权限
管理员可以对user,db,host等表进行配置,来控制用户的访问权限。
user表权限是超级用户权限。只把user表的权限授予root才是对的。对其他用户,应该把在user表中的权限设成'N'。
db表设置MySQL账户对哪些数据库有控制权,root对所有库有控制权,其他账户只对自身绑定的库有控制权。
Mysql数据库安全
Ø User_info注意防止信息泄露
Ø User.file_prive直接N,禁用所有账户的file权限,例如执行
update user set File_priv='N' where User='root'
这样就禁用了root的文件操作权限防止攻击者使用outfile/dumpfile/load_file函数
Ø Func注意udf提权自定义函数,有内容直接删,清理dll(确认func中无自定义函数设置func为只读即可。暂未测试mysql锁表后能否突破及其安全性)
禁止普通用户用GRANT语句创建新用户
启动mysql服务时必须加上--safe-user-create参数,这样的话,普通用户将不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。
MY.CNF配置文件及参数介绍
MYSQLMY.CNF配置文件及参数介绍

对于单台运行的WEB服务器,建议加上:
skip-locking  //禁止外部锁定
skip-name-resolve  //禁止使用DNS域名解析方式连接mysql
skip-networking  //禁止对外开放3306端口

PHP链接数据库时使用"LOCALHOST"这样MySQL 客户端库将覆盖之并尝试连接到本地套接字.
我们可以从PHP.INI可以看到:
Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
mysql.default_socket = /tmp/mysql.sock
也就是说,默认情况下,UNIX将访问/tmp/mysql.sock进行mysql数据库的连接和交互。
以下是部分选项解释:
my.cnf默认是不存在的.你可以在/usr/local/share/mysql/下看到以下文件:
my-huge.cnf
my-innodb-heavy-4G.cnf
my-large.cnf
my-medium.cnf
my-small.cnf
将其中合适你机器配置的文件拷贝到/etc/my.cnfmysql data目录/my.cnf(/var/db/mysql)下或~/.my.cnf.
文件内都有详细的说明
[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock
skip-locking
# 避免MySQL的外部锁定,减少出错几率增强稳定性。
skip-name-resolve
禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!
back_log = 384
指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求,该参数生效,主线程花费很短的时间检查连接并且启动一个新线程。
back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自 己的限制。
试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。
key_buffer_size = 256M
# key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。
对于内存在4GB左右的服务器该参数可设置为256M384M
注意:该参数值设置的过大反而会是服务器整体效率降低!
max_allowed_packet = 4M
thread_stack = 256K
table_cache = 128K
sort_buffer_size = 6M
查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M
read_buffer_size = 4M
读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
join_buffer_size = 8M
联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
myisam_sort_buffer_size = 64M
table_cache = 512
thread_cache_size = 64
query_cache_size = 64M
指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察:
代码: # > SHOW VARIABLES LIKE '%query_cache%';
# > SHOW STATUS LIKE 'Qcache%';如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;
如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。
tmp_table_size = 256M
max_connections = 768
指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。
max_connect_errors = 10000000
wait_timeout = 10
指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10
thread_concurrency = 8
该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4 × 2 8
skip-networking
开启该选项可以彻底关闭MySQLTCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!
Php
版本:PHP 5.1.6
Suphp方式运行php
摘要:
suPHP是一个很不错的开源工具。它可以让你的PHP代码以一种安全的方式进行运行。你可以为每个虚拟主机或者站点指定一个特定的用户来运行PHP代码。而不是像PHP和Apache默认的那样运行于nobody或者apache或者root(这样是相当危险的)这些账户下。本文将为您介绍如何安装和配置suPHP,并对安装后出现的一些问题做出解释。
最近花了一些时间研究了CentOS,遇到了不少问题,也学到了不少东西,有机会的话慢慢分享~
什么是suPHP
suPHP是一个很不错的开源工具。它可以让你的PHP代码以一种安全的方式进行运行。你可以为每个虚拟主机或者站点指定一个特定的用户来运行PHP代码。而不是像PHP和Apache默认的那样运行于nobody或者apache或者root(这样是相当危险的)这些账户下。试想,一个不成熟的PHP代码运行于root帐户下,将带来多么大的安全隐患。另外,一般而言,为了外界能正常使用网站,很多目录(比如附件目录、缓存目录等)都要设置为777才能够正常写入。这样其实也是不安全的。
而suPHP正好可以解决这个问题。首先,suPHP可以指定PHP代码以哪个帐户运行。这样您就可以把一些不安全的未经测试的PHP代限制在一些并没有实际权限的用户下进行运行。另外,通过suPHP,要求写入的目录可以只设置为755,文件等设置为644就可以让外界用户正常使用网站的每一个功能了。所以,suPHP是一个增强型的安全工具。尤其对于那些空间提供商来说。
suPHP运行的原理
PHP代码将由suPHP进行解释,然后suPHP将通过您设置好的那个帐户运行PHP解释器。
安装和配置
昨天尝试安装suPHP的时候还是遇到了不少问题,在网上也找了不少教程,但是都不是很具体或者根本用不起来。对于空间提供商来说,如果他们购买了一些面板,比如Cpanel、DirectAdmin等,那么安装suPHP和在Windows里面装软件没有多大的区别。但是对于我们这等米有钱的人来说,都要从头靠自己了。
第一步 yum安装
确定自己的系统配置和架构,32位系统和64位系统是不能装一个包的。您可以运行uname -a查看具体的信息。我的是64位的CentOS,所以架构Arch为x86_64。如果32位的话应该是i386。
另外,本文的介绍是基于CentOS系统的。其它系统配置应该是类似的,但是文件位置和命令可能不同。
suPHP安装很简单,因为可以直接通过yum进行(发现这个方式比Windows上安装软件还简单!)。
yum -y install mod_suphp
suPHP就会自动安装,另外,安装过程中,会自动创建两个配置文件:
/etc/suphp.conf – suPHP自己的配置文件
/etc/httpd/conf.d/suphp.conf – 是suPHP作为Apache扩展的配置文件
编辑suPHP的配置文件 /etc/suphp.conf
我们需要改变一些suPHP的配置。
webserver_user=apache
这一行是指定Apache运行的时候基于的帐户名。有的是nobody,而我的是用yum安装的最新的Apache 2.2,所以是以apache这个账户运行WebServer的。
x-httpd-php=php:/usr/bin/php
这一行很有意思,必须在等号后面的值两侧加上引号,否则suPHP无法识别。另外,还需要改为PHP命令行解释器(PHP commandline interpreter),即php-cgi。改后的为:
x-httpd-php="php:/usr/bin/php-cgi"
下面继续:
x-suphp-cgi=execute:!self
这一行也一样,加上引号:
x-suphp-cgi="execute:!self"
编辑suPHP模块文件/etc/httpd/conf.d/suphp.conf
这个文件会被自动加载到Apache的配置文件httpd.conf中,因此,改变这个文件,就相当于为所有的虚拟主机用户和网站用户配置了suPHP。出于一些其它方面的考虑,可能一些用户并不需要suPHP,比如phpmyadmin的站点,如果用suPHP运行的话会造成无法登陆的情况(因为用suPHP运行的时候,是基于您已经定义的帐户进行运行,所以phpmyadmin无法将session写入系统的一个文件夹/var/lib/php/session内,造成登录失败)。
所以我就把suphp.conf这个文件的所有内容都注释掉了。或者您可以可以通过mv /etc/httpd/conf.d/suphp.conf /etc/httpd/conf.d/suphp.conf.disable的方法把该配置文件改名,不让Apache加载它。
那怎么用suPHP呢,表急,我们可以通过修改虚拟主机的conf来为每一个网站用户配置suPHP。
编辑虚拟主机的配置文件
这里,我的虚拟主机配置文件放在/etc/httpd/conf.d/vhost.conf下。有的人直接把它写在了httpd.conf中,当然都可以的。单独写出来就不用每次都改httpd.conf了,主要是为了以后升级方便。
比如这里的一个虚拟主机的配置文件:
<virtualhost *:80="">
ServerName packetsense.net
DocumentRoot /home/packetsense/www/
</virtualhost>
想要这个网站运行于suPHP之下,只要在这段配置中加入下面四行就行了。
suPHP_Engine on
suPHP_UserGroup username groupname
AddHandler x-httpd-php .php .php3 .php4 .php5
suPHP_AddHandler x-httpd-php
注意,username和groupname请修改为该网站的用户名和所在的用户组。
最后一步 重启Apache
我们的配置就到这儿啦,重启一下Apache吧。
service httpd restart
当然,重启之前您可以运行一下测试,防止conf中出错。
service httpd configtest
好了,测试一下。
您可以在一个配置了suPHP的网站下创建一个这样的PHP文件测试。
<!--?php
echo "Output of the 'whoami' command:
\n";
echo exec('/usr/bin/whoami');
?-->
常见问题
500 Internal Server Error
您可以查看一下服务器的错误日志。一般而言,是由于文件的权限设置错误造成的。在本文最开始的时候,我们也提到了,suPHP只允许PHP以不高于644的权限运行,所以检查一下PHP文件的权限和所属用户组吧。
当然您可以修改suPHP的全局配置让suPHP容忍较高的文件权限等不安全的行为。
修改/etc/suphp.conf
; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false
把这些改为true就可以了。当然我还是建议去修改文件和文件夹权限。
另外,造成服务器500错误还有可能是刚才的配置不对,检查一下suPHP使用的解释器,在/etc/suphp.conf这个文件中:
错误的:x-httpd-php=”php:/usr/bin/php”
正确的:x-httpd-php=”php:/usr/bin/php-cgi”
参考:
关于SuPHP与文件权限设定
关于SuPHP与文件权限设定
cPanel中将PHP Handler 模式改变为SuPHP,因此造 成了造访页面时发生HTTP 500 Error,后来询问原因之后才知道,在SuPHP的模式下不允许任何权限为777 的目录及文件。另外在SuPHP的模式下也不支持透过.htaccess 文件修改php.ini 参数,因此如果原本.htaccess文件中有存在着php_ 开头的设定,也将造成造访网页时,产生500错误。
那遇到这些问题时,该怎么解决呢?
首先先检查网站上,网页的文件中是否还有目录或文件权限为777,如果有,则把目录权限修改为755,文件权限修改为644。感觉只要在网页目录下执行chmod 644 -R *.*就可以解决了,但,事情总没有那么简单,这样的执行并不完整,最后在网络上找到了关于主机设定为SuPHP后要如何设定的数据,看到了更完整更好的修改所有目录及权限方法。
修改目录权限
find /home/*/public_html -type d -exec chmod 755 {} \;
修改文件权限
find /home/*/public_html -type f -exec chmod 644 {} \;
上述的方法之中,可以把find里的路径修改为自己主机上的路径,其实可以算是find很进阶的使用。如果你的主机并不是所有的文件都要设定为644那,可以参考这个网页中的方法
find /home/*/public_html/ -type d -print0 | xargs -0 chmod 0755 # For directories
find /home/*/public_html/ -type f -not -name "*.pl" -not -name "*.cgi" -not -name "*.sh" -print0 | xargs -0 chmod 0644 # For files
至于,为什么主机那边要从CGI改变为SuPHP呢?根据这一篇文章中所提到的,可以看到主要的原因就是SuPHP安全性比较高,但性能相对于CGI较差。
启用php安全模式
修改php.ini中的safe_mode的值为on,启用安全模式。
当safe_mode=on时,php运行在安全模式下,在安全模式下,很多php函数会受到限制,比如我们执行DOS命令所需要的system()函数、exec()函数等等,关于安全模式下有哪些函数被限制,请看:http://www.php.net/manual/zh/features.safe-mode.functions.php
当safe_mode=off时,php运行在非安全模式下,也就是普通模式,所有的php函数不会受到限制,一般情况下,只有在非安全模式下,DOS命令才能在php脚本中被成功执行,可以说,要想在php的webshell中执行DOS命令,safe_mode=off是一个必需条件。
当安全模式打开的时候,以下函数列表的功能将会受到限制:
chdir , move_uploaded_file, chgrp, parse_ini_file, chown, rmdir, copy, rename, fopen, require, highlight_file, show_source, include, symlink, link, touch, mkdir, unlink
同样的,一些PHP扩展中的函数也将会受到影响。(加载模块:在安全模式下dl函数将被禁止,如果要加载扩展的话,只能修改php.ini中的扩展选项,在PHP启动的时候加载)
在PHP安全模式打开的时候,需要执行操作系统程序的时候,必须是在safe_mode_exec_dir选项指定目录的程序,否则执行将失败。即使允许执行,那么也会自动的传递给escapeshellcmd函数进行过滤。
以下执行命令的函数列表将会受到影响:
exec, shell_exec, passthru, system, popen
另外,背部标记操作符(`)也将被关闭。
当运行在安全模式下,虽然不会引起错误,但是 putenv 函数将无效。同样的,其他一些尝试改变PHP环境变量的函数set_time_limit, set_include_path 也将被忽略。
禁用php危险函数
修改php.ini中的disable_functions的值,禁用以下可被用来执行dos命令的函数:
危险函数
操作
风险
Exec()
禁用
可被用来执行系统命令
System()
禁用
可被用来执行系统命令
passthru()
禁用
可被用来执行系统命令
escapeShellCmd()
禁用
可被用来执行系统命令
shell_exec()
禁用
可被用来执行系统命令
phpinfo()
禁用
可被用来获取系统敏感信息
chroot()
禁用
可被用来改变当前 PHP 进程的工作根目录
scandir()
禁用
可被用来列出指定路径中的文件和目录
chgrp()
禁用
可被用来改变文件或目录所属的用户组
chown()
禁用
可被用来改变文件或目录的所有者
proc_open()
禁用
可被用来执行一个命令并打开文件指针用于读取以及写入
proc_get_status()
禁用
可被用来获取使用 proc_open() 所打开进程的信息
error_log()
禁用
可被用来将错误信息发送到指定位置(文件),在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,执行任意命令
ini_alter()
禁用
可被用来修改、设置 PHP 环境配置参数
ini_set()
禁用
可被用来修改、设置 PHP 环境配置参数
ini_restore()
禁用
可被用来恢复 PHP 环境配置参数到其初始值
dl()
禁用
可被用来在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块
pfsockopen()
禁用
可被用来建立一个 Internet [size=11.0000pt]或 UNIX 域的 socket 持久连接
syslog()
禁用
可被用来调用 UNIX 系统的系统层 syslog() 函数
readlink()
禁用
可被用来返回符号连接指向的目标文件内容
symlink()
禁用
可被用来在 UNIX 系统中建立一个符号链接
popen()
禁用
可被用来通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行
stream_socket_server()
禁用
可被用来建立一个 Internet [size=11.0000pt]或 UNIX 服务器连接
putenv()
禁用
可被用来在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令
在这里填写函数名时不需要加括号(),结尾不需要加分号;,函数与函数中间以英文逗号相隔,间隔无空格。
例如禁用phpinfo以后,再使用这个函数就会:
Warning: phpinfo() has been disabled for security reasons in XX.XX line x
禁止将所有变量注册为全局变量
修改php.ini,设置register_globals=off
如果这个选项开启,那么在PHP中提交的变量,包括使用POST或者GET提交的变量,都将自动注册为全局变量,能够直接访问,这是对服务器非常不安全的,所以我们不能让它注册为全局变量,需要关闭注册全局变量选项。
限定php可访问的目录
修改php.ini中的open_basedir,限定php可访问的目录。
如下是php.ini中的原文说明以及默认配置:
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory or
; per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir = .
open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也可用符号"."来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。 举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。
例如设置成: "open_basedir = /dir/user/"
open_basedir也可以同时设置多个目录, 在Windows中用分号分隔目录,在任何其它系统中用冒号分隔目录。当其作用于Apache模块时,父目录中的open_basedir路径自动被继承。
有三种方法可以在Apache中为指定的用户做独立的设置:
(a) 在Apache的httpd.conf中Directory的相应设置方法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/
(b) 在Apache的httpd.conf中VirtualHost的相应设置方法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /var/www/html/:/var/tmp/
(c) 因为VirtualHost中设置了open_basedir之后, 这个虚拟用户就不会再自动继承php.ini中的open_basedir设置值了,这就难以达到灵活的配置措施, 所以建议您不要在VirtualHost中设置此项限制. 例如,可以在php.ini中设置open_basedir = .:/tmp/, 这个设置表示允许访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录.
请注意: 若在php.ini所设置的上传文件临时目录为/tmp/, 那么设置open_basedir时就必须包含/tmp/,否则会导致上传失败. 新版php则会提示"open_basedir restriction in effect"警告信息, 但move_uploaded_file()函数仍然可以成功取出/tmp/目录下的上传文件,不知道这是漏洞还是新功能。
引用:open_basedir后可能存在的安全隐患:http://www.oldjun.com/blog/index.php/archives/80/
关闭allow_url_include,禁用远程包含
修改php.ini中的allow_url_include=off,禁用远程包含文件
限制php.ini的读写权限
修改php.ini的权限,限制只有root可以写,其他所有系统账户都可读不可写。
禁用phpCLI模式
CLI是Command Line Interface的缩写,即命令行界面。禁用php的CLI模式。
启用Xcache缓存
启用Xcache缓存,加快PHP解析速度。
去掉HTTP响应头部的x-power
例如:
HEAD / HTTP/1.0
Host: arcoiris.tv
Accept: */*
Connection: Keep-Alive
HTTP/1.1 200 OK
Date: Fri, 20 May 2011 18:37:50 GMT
Server: Apache/2.2.17 (Win32) PHP/5.2.8
X-Powered-By: PHP/5.2.8
Set-Cookie: PHPSESSID=hakhoeidtb1kv78dh4aik8arc6; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: lang=italian; expires=Sat, 19-May-2012 18:37:50 GMT
Vary: Accept-Encoding
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
修改php.ini(Windows下可能是php5.ini)也有可能是apache/bin/php.ini
看读取配置的路径
Expose_php = off
保存后,重启中间件后生效。
开启魔术引号
修改php.ini中的magic_quote_gpc=on,开启魔术引号。
关闭错误回显
修改php.ini中的display_errors = Off即可,这样php函数执行错误的信息将不会再显示给用户。
如果是调试时确实需要这些信息,那么可以将错误日志记录到指定的文件中。
先开始错误回显:log_errors = On
然后找到下面这行:
;error_log = filename
去掉前面的分号;注释,把filename改为指定文件,如/usr/local/apache/logs/php_error.log
这样所有的错误都会写到php_error.log文件里。
建议把错误日志文件跟apache的日志存在一起:
error_log = /usr/local/apache2/logs/php_error.log
注意:
必须允许运行apache用户的和组对错误日志文件有写的权限。
可以禁止运行apache用户的和组对错误日志文件有读的权限。
可以禁止除运行apache用户的和组之外的用户和组对错误日志文件的读写权限。
修改上传文件最大体积为10M
修改php.ini中的upload_max_filesize的值为10。
打开php.ini,首先找到
file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值。默认为2M
post_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,在网络正常的情况下。
但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。
进一步配置以下的参数
max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M
把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了。
设定安全模式下执行程序主目录(不适用)
如果安全模式打开了,但是却是要执行某些程序的时候,可以指定要执行程序的主目录 :safe_mode_exec_dir= D:/usr/bin
一般情况下是不需要执行什么程序的,所以推荐不要执行系统程序目录,可以指向一个目录,然后把需要执行的程序拷贝过去。
比如: safe_mode_exec_dir = D:/tmp/cmd
但是,我更推荐不要执行任何程序,那么就可以指向我们网页目录:
safe_mode_exec_dir = D:/usr/www
安全模式下允许包含文件(不适用)
如果要在安全模式下包含某些公共文件,那么就修改一下选项:
safe_mode_include_dir = D:/usr/www/include/
其实一般 php 脚本中包含文件都是在程序自己已经写好了,这个可以根据具体需要设置。
[size=10.5000pt]


评论(1)复制地址
发布:soojoy | 分类:技术文章 | Tags:

相关文章:

tag

2019-5-5 0:38:081楼
学习了 - 回复该留言

zear

2020-8-20 17:07:572楼
各大快递单号出售网站www.uudanhaowang.com - 回复该留言

发表留言

记住我,下次回复时不用重新输入个人信息
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。