蜗牛真理

导航

LNMP环境搭建及安全加固

1.Linux选择了之前就安装好的centos7

基于centos7主机安全加固思考

这里虽然有很多资料总结和参考,但是能让自己记住的,是知道加固的意义所在,换句话说就是曾经真从这里攻击过,不然也是走马观花。同时,这里的安全问题囿于自己从业经验少,只是自己去想了下。

a.账号

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

centos7之前是chkconfig start nginx

ps:之前通过源码编译安装过,源码安装需要注意先安装GCC编译器(将源码编译为二进制程序)、PCRE(解析正则表达式)、zlib(提供数据压缩的函式库)、OpenSSL(NGINX应用HTTPS和MD5、SHA1等需要。

2.2安装成功

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

3.2检查php及其扩展安装成功与否

基于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.安装MySQL(被收购后现在都是安装MariaDB了)

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进程那里,前后端交互数据交换的理解更加深刻……

安全是活的,动态的,存在即是安全……

 

 

 

 

 

 

posted on 2020-09-23 16:48  蜗牛真理  阅读(445)  评论(0编辑  收藏  举报