- 论坛徽章:
- 0
|
OpenBSD.Apache.MySQL.PHP环境搭建手册[第一版]
一、OpenBSD.Apache.MySQL.PHP软件环境的安装
OpenBSD内核中已经集成了Apache,而且内置了对PHP的支持,所以安装MySQL、PHP环境非常的简单。
需要注意的是,在系统安装分区的时候,请按下面的示例进行分区(80G硬盘):
/ | 200M | (swap) | 1G | /tmp | 200M | /usr | 500M | /usr/local | 200M | /var | 100M | /var/mysql | 10G | /var/mail | 100M | /var/log | 5G~10G | /home | 200M | /var/www | 剩余空间 |
在安装程序询问要安装的组件时,最好不要选择comp44.tgz这个包,系统安装到最后询问是否默认启动服务时,一律回答“No”。
halt重启后执行下面的命令安装必须的软件,以OpenBSD4.4为例进行讲解,root权限。- export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.4/packages/i386/
- pkg_add wget mysql-server php5-gd-5.2.6-no_x11 phpMyAdmin pecl-APC
复制代码 等所需的软件都安装完成后,按提示作链接并创建PHP临时目录:
ln -s /var/www/conf/modules.sample/php5.conf /var/www/conf/modules
ln -fs /var/www/conf/php5.sample/apc.ini /var/www/conf/php5/apc.ini
ln -fs /var/www/conf/php5.sample/gd.ini /var/www/conf/php5/gd.ini
ln -fs /var/www/conf/php5.sample/mbstring.ini /var/www/conf/php5/mbstring.ini
ln -fs /var/www/conf/php5.sample/mcrypt.ini /var/www/conf/php5/mcrypt.ini
ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini
mkdir /var/www/tmp
chmod 0777 /var/www/tmp
二、使MySQL适应chroot环境
由于OpenBSD中的Apache默认工作于chroot环境下,无法直接与MySQL通信,所以需要修改下MySQL的配置文件,使之适应chroot环境。
执行下面的命令:- mkdir -p /var/www/var/run/mysql
- chown _mysql:_mysql /var/www/var/run/mysql
复制代码 等到上面的命令都执行完成后,还需要修改MySQL的配置文件。将[client]段的socket修改成:
socket = /var/www/var/run/mysql/mysql.sock
将[mysqld]段的socket修改成:
socket = /var/www/var/run/mysql/mysql.sock
在[mysqld]段增加:
skip-networking
其他的请酌情修改。
改完后保存退出。
三、phpMyAdmin的配置
在上面pkg_add phpMyAdmin以后,提示ln做个连接就可以用phpMyAdmin了。不过偶试了,是不行的,404错误。所以,我们需要把phpMyAdmin拷贝到/var/www/htdocs目录下面使用。- mkdir /var/www/htdocs/pma
- cp -rf /var/www/phpMyAdmin/* /var/www/htdocs/pma/
复制代码 同样需要修改pma目录下的config.inc.php文件,加个字母即可。
其他关于PHP的强化、SSH强化、PF防火墙以及系统其他部分的安全强化,可以参照一楼和二楼的相关内容,这里就不罗嗦了。
另外,由于Apache已经是chroot,所以PHP的强化设置会略有不同,如下:
# 禁止动态加载模块
enable_dl = Off
# 隐藏PHP信息
expose_php = Off
# 限定可访问目录
# 注意此时的根目录实际是/var/www目录
open_basedir = /
# 设定PHP上传文件的临时目录
# 同理,此时的/tmp目录实际是/var/www/tmp目录
upload_tmp_dir=/tmp
# 禁用危险函数(注意下面的内容应该是一行,编排的原因分成了多行)
disable_functions = phpinfo,com,shell,exec,system,passthru,error_log,
stream_socket_server,putenv,ini_alter,ini_restore,ini_set,dl,openlog,
syslog,readlink,symlink,link,leak,fsockopen,pfsockopen,proc_open,
popepassthru,escapeshellcmd,escapeshellarg,chroot,scandir,
chgrp,chown,shell_exec,proc_get_status,popen,shmop_close,
shmop_delete,shmop_open,shmop_read,shmop_size,shmop_write
# 启用PHP的安全模式
safe_mode = On
# pecl-APC只使用16M的共享内存用以加速PHP程序的运行
apc.shm_size=16M
四、O.A.M.P.的启动
对于Apache来说,系统虽然提供了自动启动的方法,但是因为考虑到MySQL需要先启动,因此仍然在/etc/rc.local文件中解决。跳到最后,加入:
rdate -n 210.72.145.44
# Start MySQL
if [ -x /usr/local/bin/mysqld_safe ] ; then
echo -n 'Starting MySQL...'
su -c mysql root -c '/usr/local/bin/mysqld_safe >/dev/null 2>&1 &'
echo "DONE"
fi
# Start Apache
apachectl start
五、提高O.A.M.P.环境的安全性
在O.A.M.P.环境下,除了可以和O.N.M.P.环境下一样设置提高安全性以外,在Apache环境下,还可以安装mod_security这个模块来提高web程序的安全性。- export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.4/packages/i386/
- pkg_add modsecurity-apache
复制代码 安装完成后使用下面的命令启用mod_security:- /usr/local/sbin/mod_security-enable
复制代码 mod_security可以用来抵御XSS和SQL注入等攻击,我们需要把一些“防御”指令加到mod_security的配置文件中:- vi /var/www/conf/modules/modsecurity.conf
复制代码 输入下面的内容:
# 启用mod_security过滤
SecFilterEngine On
# 分析URL请求
SecFilterCheckURLEncoding On
# 检查字节长度以避免栈溢出攻击(数字请酌情修改)
SecFilterForceByteRange 32 126
# 有效记录日志信息
SecAuditEngine RelevantOnly
# 定义日志文件
SecAuditLog logs/audit_log
# 定义DEBUG文件
SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLevel 0
# 检查POST请求(某些POST请求可能会和这个冲突)
# 使用phpMyAdmin管理数据库时,某些操作会被这个拦截(例如新建数据库和用户时)
# 遇此情况,则把此行注释掉,重启Apache
# 操作完后记得恢复,以提高数据库的安全性
SecFilterScanPOST On
# 阻止返回406错误
SecFilterDefaultAction "deny,log,status:406"
# 阻止返回500错误
SecFilterDefaultAction "deny,log,status:500"
# 当攻击者使用chmod,chgrp,wget等命令的時候,重定向到特殊的页面(请自行酌情增减)
SecFilter chmod redirect:http://www.google.com
SecFilter chgrp redirect:http://www.google.com
SecFilter wget redirect:http://www.google.com
# 防止操作系统关键词攻击
SecFilter /bin
SecFilter /sbin
SecFilter /etc
SecFilter /bsd
SecFilter /usr
SecFilter /var
# 只接受知道如何处理的请求
# GET请求是个例外,是因为某些客户端把text/html当做请求内容的一部分
SecFilterSelective REQUEST_METHOD "!^(GET|HEAD)$" chain
SecFilterSelective HTTP_Content-Type "!(^application/x-www-form-urlencoded$|^multipart/form-data;)"
# 不接受仅有GET和HEAD头的请求
SecFilterSelective REQUEST_METHOD "^(GET|HEAD)$" chain
SecFilterSelective HTTP_Content-Length "!^$"
# 要求每个POST请求提供长度
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"
# 不接受无法处理的转换
SecFilterSelective HTTP_Transfer-Encoding "!^$"
# 防止目录遍历攻击
SecFilter "\.\./"
# 防止跨站(XSS)攻击(HTML/Javascript注入)
SecFilter "<( |\n)*script"
SecFilter "<(.|\n)+>"
# 防止SQL注入攻击(简单示例,请自行完善)
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
SecFilter "union[[:space:]]+from"
SecFilter "drop[[:space:]]"
# 需要HTTP头确认
SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
# 呵呵~~~把服务器伪装成M$机器
ServerTokens Full
SecServerSignature "Microsoft-IIS/6.0"
# 限制upload.php文件只能用来上传jpeg,bmp和gif的文件(仅为示例,请酌情修改)
#<Location /upload.php>
#SecFilterInheritance Off
#SecFilterSelective POST_PAYLOAD "!image/(jpeg|bmp|gif)"
#</Location>
在/usr/local/share/doc/mod_security目录下有pdf版本的使用手册,可以用PSFTP down下来仔细研究。自带的配置示例:
/usr/local/share/examples/mod_security/httpd.conf.example-minimal。
记住把mod_security的配置文件保存在/var/www/conf/modules目录,例如上面的:/var/www/conf/modules/modsecurity.conf
mod_security的配置按需修改好后,保存退出,重启Apache即可!
注意:上面的配置仅为示例,未必适合你的环境,请结合环境情况酌情修改!个别参数调整不当可能造成无法访问的后果!
写在最后
现在mod_security已经出到2.5.9版了,更多新特性,防护更全面,但是需要在Apache 2.0.x以上的环境下才能安装使用。而OpenBSD软件包中的Apache 2.2.8竟然不是chroot,安全起见,只能暂时作罢。
mod_security新版的过滤规则貌似和旧版有很大的变化,迟些日子看看能不能把新版的mod_security规则“翻译”到旧版下使用,届时再出O.A.M.P.手册第二版吧! ^_^
对部分网友回复的解答:
====================================
67、68楼:
[quote]原帖由 dooros 于 2009-4-22 08:41 发表
运行下面的命令生成查看Nginx运行状态的密码文件:
[Copy to clipboard] [ - ]CODE:
htpasswd -c /etc/nginx/password webadmin
按提示输入两遍密码即可。
在查看status的时候,输入用户名webadmin(见上面这行)和密码就能够看到Nginx的运行数据了。
我只完成到这一步,怎么不能看到nginx运行?
已经删除IP限制,已经重启系统。
在bsd下lynx http://192.168.175.130/status也不能连接上。貌似nginx没启动?
原帖由 dooros 于 2009-4-22 09:09 发表
nginx -t -c /etc/nginx/nginx.conf
后,显示失败:
2009/04/21 12:42:12 [emerg] 21716#0: unknow directive "work_rlimit_nofile" in /etc/nginx/nginx.conf :11
2009/04/21 12:42:12 [emerg] 21716#0: t ...
- 命令行下输入top看看,是否有nginx进程,即可判断nginx是否已启动(二楼的帖子最后有截图)。
nginx正常启动后,在浏览器中输入:http://192.168.175.130/status即可看到nginx的运行状态。
- 出现上面的提示,是因为你输入的参数有误。仔细看下,应该是worker,而不是work。
其实你可以在PuTTY中使用复制、粘贴的方法把这些命令啊、配置文件啊等东东都搞定的,无须手动输入(复制好后,在PuTTY中鼠标右键粘贴即可)。
某些虚拟机软件也有复制、粘贴的功能,就不会出现拼写的错误了,请自行查一下。 [/quote]
====================================
73楼:
[quote]原帖由 dooros 于 2009-4-24 13:57 发表
新问题,如果我要安装一个Discuz如何像使用虚拟空间那样,把文件上传上去,然后开始安装呢?是不是要自己设置开启ftp服务?(关键是不知道怎么才可以使上传的文件正好在/var/nginx/html文件夹里)
无须开启FTP服务,简单点说。- export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.4/packages/i386/
- pkg_add unzip
- cd /tmp
- wget http://download.comsenz.com/UCenter/1.5.0/UCenter_1.5.0_SC_UTF8.zip
- mkdir /var/nginx/html/uc
- unzip UCenter_1.5.0_SC_UTF8.zip
- cp -rf /tmp/upload/* /var/nginx/html/uc
- rm -rf /tmp/*
- ...
- ...
- wget http://download.comsenz.com/Discuz/7.0.0/Discuz_7.0.0_SC_UTF8.zip
- mkdir /var/nginx/html/bbs
- unzip Discuz_7.0.0_SC_UTF8.zip
- cp -rf /tmp/upload/* /var/nginx/html/bbs
- rm -rf /tmp/*
- ...
- ...
复制代码 明白?
如果是本机上的文件,需要传到服务器上,记得二楼曾经说过的PSFTP?仍然无须开启FTP服务。[/quote]
====================================
77楼:
[quote]原帖由 czjin 于 2009-5-10 20:49 发表
openbsd4.5已出来了,不知在安装Nginx Mysql PHP eAccelerator Zend Optimizer 等方面会与openbsd4.4有什么不同?我准备在VM机上测试,碰到问题再请教楼主。
[/quote]
[ 本帖最后由 young_king 于 2009-5-11 09:53 编辑 ] |
|