LNMP环境搭建及安全加固
基于centos7主机安全加固思考
这里虽然有很多资料总结和参考,但是能让自己记住的,是知道加固的意义所在,换句话说就是曾经真从这里攻击过,不然也是走马观花。同时,这里的安全问题囿于自己从业经验少,只是自己去想了下。
cat /etc/pwsswd | wc -l 统计多少用户
cat /etc/passwd | grep :0 查看root权限的用户
cat /etc/shadow 带有! *的就是被锁定无法登陆的用户
cat /etc/group 查看用户组
(这些提供了解一台Linux主机的基本账户信息,当然扩展下还有账户uid等等详细信息,先不赘述了,说这些的目的在于形成自己脉络,以下的都是总结到了二级。没有完全深入到三四级的操作。)
vi /etc/pam.d/su 编辑这个设置禁止普通用户su到root
b.授权
chmod 命令 设置重要文件的权限,如日志文件、历史命令记录文件、还有账户配置文件等等。
umask设置 如027
服务授权 如ftp服务禁某些用户匿名登录
c.口令
vi /etc/pam.d/system-auth 密码复杂度设置,如数字、大小写字母、特殊字符组成八位及其以上,更多时候渗透就是弱口令致命,灯下黑。123456永远的神。
vi /etc/pam.d/sshd 连续密码错误锁定 避免爆破
vi /etc/login.defs 密码更新周期 强制每多少天更新一次,还要保证前后不同。
d.远程登录
vi /etc/hosts.allow(deny) 限制IP访问绝户计
vi /etc/profile 超时设置
vi /etc/ssh/sshd_config 禁止直接登录root账户,需要从普通账户su到root;结合前边的禁止su到root,就只能本地root账户登录了。
e.端口关闭
首先防火墙肯定是开启的啊,
firewall-cmd --list-port 查看哪些端口开放
firewall-cmd --zone=public --add-port=3838/tcp --permanent 增加tcp端口 关闭端口就把add改成remove
firewall-cmd --zone=public --add-port=3838/udp --permanent
firewall-cmd --reload 重新加载 不中断用户连接,不丢失状态信息。学到了这里自己以前都是重启,这在生产环境里没死是大福气啊,靠。
f.日志
audit 记录与安全相关日志 需要结合业务自己调整规则库吧,而syslog是偏向应用层的错误日志。
对重要日志配置日志服务器
g.内核调整
防止堆栈溢出,只是看过,不怎么懂了。
h.地址解析顺序
更改主机解析地址顺序,防止IP欺骗。
i.补丁更新
uname -a看看版本 大漏 ms17-010这种的,新三年旧三年啊,补丁服务器的设置。
j.banner信息屏蔽
系统banner信息(/etc/rc.d/rc.local)、ftp banner(/etc/vsftp.d/vsftp.conf)信息等等#掉。
2.Nginx安装
2.1yum安装之前准备:由于默认的没有yum源,所以需要添加nginx到yum源,并安装nginx
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx -y
systemctl start nginx
systemctl enable nginx
ps:之前通过源码编译安装过,源码安装需要注意先安装GCC编译器(将源码编译为二进制程序)、PCRE(解析正则表达式)、zlib(提供数据压缩的函式库)、OpenSSL(NGINX应用HTTPS和MD5、SHA1等需要。
ps:Nginx配置信息
网站文件存放默认目录
/usr/share/nginx/html
网站默认站点配置
/etc/nginx/conf.d/default.conf
自定义Nginx站点配置文件存放目录
/etc/nginx/conf.d/
Nginx全局配置
/etc/nginx/nginx.conf
基于nginx web容器安全加固的思考
nginx作为优秀的正反向代理web服务器,多线程,高并发等特点。顺便记下正反向代理,代理客户端就是正向,反之代理服务端就是反向代理。另外正向代理可以作为上网行为管理;反向代理除了负载均衡,暴露的是代理服务器在公网的IP,隐藏了内网web服务器。
对于nginx每修改一次记得备份重启一次。推荐平滑重启nginx -s reload
a.限制目录访问
vi /etc/nginx/nginx.conf 在HTTP模块增加 autoindex off; 因为nginx会自动下载web目录下的文件,增加威胁暴露面。
b.隐藏版本信息
vi /etc/nginx/nginx.conf 在HTTP模块增加server_tokens off 隐藏版本信息,如HTTP响应里就看不到了。这里得重启,重新载入配置不管用。
c.限制HTTP请求方法
vi /etc/nginx/conf.d/default.conf 在server模块增加
if ($request_method !~* GET|POST|HEAD) {
return 403;
} //拒绝除了get|post|head外的请求方式
d.nginx降权
vi /etc/nginx/nginx.conf 增加 user nobody; 这样就算web服务权限失陷,也不会是root权限。这还涉及运维知识,nobody是Linux用来执行服务主进程之外进程的用户,为了达到失少不失全效果,若一开始用root部署的nginx,做好了负载均衡,后边重启服务每次都要root,麻烦;而且想换了,还会导致缓存访问权限不足进而进程缓慢,服务瘫痪等后患。
e.防盗链
编辑nginx.conf配置文件(vi /etc/nginx/nginx.conf ),在server标签内添加如下内容:
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
valid_referers none blocked server_names *.nsfocus.com http://localhost baidu.com;
if ($invalid_referer) {
rewrite ^/ [img]http://www.XXX.com/images/default/logo.gif[/img];
#return 403;
}
}
f.限制IP访问
编辑nginx.conf配置文件(vi /etc/nginx/nginx.conf ),在server标签内添加如下内容:
location / {
deny ip;
allow ip;
}
g.补丁更新
nginx -v #查看版本信息
nginx -t #查看配置文件
然后选择补丁
3.安装PHP-fpm
yum install php php-fpm php-mysql php-mbstring php-xml -y
安装php-fpm是为了让NGINX与PHP链接
安装php-mysql是为了让MySQL与PHP连接
安装php-mbstring作用解决中文乱码
安装php-xml作用解析xml
基于php-fpm的安全加固思考
php-fpm配置文件路径:/etc/php-fpm.d/www.conf php配置文件路径:/etc/php.ini
a.php-fpm降权
修改/etc/php-fpm.d/www.conf,将 user = apache group = apache,改为 user = nobody group = nobody;关于nobody在Linux系统中的作用上边说了点。
b.安全模式
本来有,但是5.3以后就弃用了。
c.禁用不安全的PHP函数
vi /etc/php.ini
disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,phpinfo
#这样之前测试php nginx连通用的phpinfo函数就失效了。
d.关闭错误日志
vi /etc/php.ini
display_errors = Off
#避免报错暴露物理路径造成的文件上传或者sql报错注入、getshell。之前i春秋的ctf初级训练营里有一个就是利用PHP报错查看到数据库版本吧好像。
e.启用HTTPOnly
vi /etc/php.ini
session.cookie_httponly = 1
通过document盗用cookie预防XSS,但是可以在socket层抓包程序进阶攻击。
f.关闭PHP信息
vi /etc/php.ini
expose_php = Off
这样设置在http请求里就看不到x-powered-by:php/5.4.16了
g.限制目录访问
vi /etc/php.ini
open_basedir = ./:/tmp:/home/www/配置的目录 坏处就是影响IO流
h.限制上传目录
vi /etc/php.ini
upload_tmp_dir = /tmp定义的上传目录,防止目录穿越。
4.nginx和php-fpm连接测试成功
在index.php里写入<?php phpinfo(); ?>,然后浏览器访问可以看到PHP代码执行成功了。
需要注意的是修改了nginx的网站默认站点配置文件:去掉如上图所示的注释符号#,同时$document_root修改了,更加不要忘记给php-fpm指明PHP文件存放路径:/usrshare/nginx/html。我之前安装了好多遍,发现源码编译安装就不会有这个问题存在,而yum安装就会有这个路径指明问题需要格外注意!!
5.1yum安装mysql
yum install mariadb* -y
同时启动及设置自启动mysql服务。
5.2设置mysql密码:
mysql -uroot -p
这里的数据库需要首先修改上初始密码才可以使用。另外update语句更正下删除from。
基于mysql安全加固的思考
a.普通账户运行mysql
vi /etc/my.cnf
[mysql.server]
user=mysql
b.root远程登录限制-可信IP登录等等
mysql> grant all privileges on *.* to 'root' @localhost identified by 'password'with grant option;
mysql> flush priveleges;
mysql> grant all privileges on *.* to '用户名' @'允许访问的IP地址' identified by 'password'with grant option;
mysql> flush priveleges; //只允许这个地址访问但给了全部权限
mysql> grant all privileges on *.* to '用户名' @'允许访问的IP地址' identified by 'password';
mysql> flush priveleges; //只允许这个地址访问但是不给全部权限
c.删除空口令账户(匿名账号)
mysql> delete from user where user="";
mysql> flush priveleges;
d.历史命令保护,防止泄露配置等敏感信息
rm .bash_history .mysql_history //删除历史记录
ln -s /dev/null .bash_history
ln -s /dev/null .mysql_history //设置数据库操作记录不记录在 2 个文件中
e.配置日志、密码复杂度和更换周期、限制单用户会话数量、登录失败处理功能等等
6.php与mysql连接测试成功
cd /usr/share/nginx/html/
vi mysql.php //写入连接mysql的PHP测试代码。
7.总结
我的报告格式不行,要改。
再就是踩坑的话,注意配置文件格式对齐,yum安装nginx指明读取PHP文件的路径;再就是php高版本后支持mysqli了;修改什么前一定先备份,先写出技术方案,修改后一定要重启或者重载;mysql第一步先修改空密码才可用;
收获很多的,让零碎的知识耦合了下,部署和加固同时想,能体会到攻防一体促进步的重要性。比如在加固PHP HTTPOnly那里时候联想到了余弦的《web前端黑客技术揭秘》里说的内容,就更加融合了,促进理解。再比如了解php-fpm:fastCGI进程那里,前后端交互数据交换的理解更加深刻……