热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

docker部署nginx+php+mysql开发环境

信安之路-第一关静中藏了一个争字,稳中藏了一个急字,忙中藏了一个亡字,忍中藏了一个刀字,越想争心越要静。越急心越要稳。越忙越要照顾好自己。越忍越要看清事态本次目的:熟悉Linux+

信安之路-第一关

静中藏了一个争字,稳中藏了一个急字,忙中藏了一个亡字,忍中藏了一个刀字,越想争心越要静。越急心越要稳。越忙越要照顾好自己。越忍越要看清事态



本次目的:熟悉Linux+Nginx+PHP-fpm-Mysql开发环境的搭建。从基本开始,一步一步来。搭建完成后,进行加固,熟悉基础加固的思路。



linux

linxu采用centos虚拟机安装 最小化安装。安装完成后换源.


换源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup #备份
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #下载阿里云的源
yum makecache #生成缓存

加固


从互联网收集的加固手册,按着流程来一遍。先来一个自己总结的思维导图


image-20220618181545539


账号管理


账号

用户口令设置


  1. 由于虚拟机搭建使用简单口令,root/root,对口令进行加强

  2. 执行:more /etc/login,检查PASS_MAX_DAYS/PASS_MIN_LEN/PASS_MIN_DAYS/PASS_WARN_AGE参数

  3. awk -F: '($2 == "") { print $1 }' /etc/shadow 检查是否存在空口令账号


思考:弱口令 空口令 密码复杂度



检查是否存在除root之外UID为0的用户

awk -F: '($3 == 0) { print $1 }' /etc/passwd #

只允许root一个uid为0



root用户环境变量的安全性

echo $PATH | egrep '(^|:)(\.|:|$)' #检查是否包含父目录
find `echo $PATH | tr ':' ' '` -type d \( -perm -002 -o -perm -020 \) -ls 检查是否包含组目录权限为777的目录

思考:确保root用户的系统路径中不包含父目录,在非必要的情况下,不应包含组权限为777的目录



认证

远程连接的安全性配置

执行:find / -name .netrc,检查系统中是否有.netrc文件
执行:find / -name .rhosts ,检查系统中是否有.rhosts文件

有文件则低于要求



用户的umask安全配置

执行: more /etc/csh.login more /etc/csh.cshrc more /etc/bashrc检查是否包含umask值 默认的低于要求

重要目录和文件的权限设置

ls –l /etc/
ls –l /etc/rc.d/init.d/
ls –l /tmp
ls –l /etc/inetd.conf
ls –l /etc/passwd
ls –l /etc/shadow
ls –l /etc/group
ls –l /etc/security
ls –l /etc/services
ls -l /etc/rc*.d # 权限过低,则低于安全要求

重要目录需要 chmod -R 750 file 只有root可以读、写和执行这个目录下的脚本


查找未授权的SUID/SGID文件

for PART in `grep -v ^# /etc/fstab | awk '($6 != "0") {print $2 }'`; do
find / \( -perm -04000 -o -perm -02000 \) -type f -xdev -print
Done #非空低于要求

检查任何人都有写权限的目录

for PART in `awk '($3 == "ext2" || $3 == "ext3") \
{ print $2 }' /etc/fstab`; do
find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
Done #非空低于要求

查找任何人都有写权限的文件

for PART in `grep -v ^# /etc/fstab | awk '($6 != "0") {print $2 }'`; do
find $PART -xdev -type f \( -perm -0002 -a ! -perm -1000 \) -print
Done #非空低于要求

查找没有属主的文件

for PART in `grep -v ^# /etc/fstab | awk '($6 != "0") {print $2 }'`; do
find $PART -nouser -o -nogroup -print
done #非空低于要求

检查异常隐含文件

find / -name ".. *" -print –xdev
find / -name "…*" -print -xdev | cat -v #非空低于要求

日志审计


日志

more /etc/syslog.conf 查看参数authpriv值 对所有登录事件都记录

审计

more /etc/syslog.conf
#需设置
kern.warning;*.err;authpriv.none\t@loghost
*.info;mail.none;authpriv.none;cron.none\t@loghost
*.emerg\t@loghost
local7.*\t@loghost

系统文件


系统core dump状态

more /etc/security/limits.con
#需要包含一下项
* soft core 0
* hard core 0

其他思考

1. 指定IP可以远程登录,设置远程登录超时
2. 禁止直接登录root账户,需要从普通账户su到root;结合前边的禁止su到root,就只能本地root账户登录了
3. 开启防火墙
4. 对web业务开启防ddos攻击防护
5. 更改主机解析地址顺序,防止IP欺骗。
6. 补丁更新,防止被提权
7. 一些系统的指纹信息屏蔽 比如ftp ssh等等

nginx+php+mysql-docker部署

docker pull nginx
docker pull php:7.1-fpm
docker pull mysql:5.7

创建文件夹

# 网站目录
mkdir -p /data/www
# nginx 配置
mkdir -p /data/nginx/conf.d

# mysql数据
mkdir -p /data/mysql/data
# mysql配置
mkdir -p /data/mysql/conf.d

创建 Nginx 容器

docker run --rm nginx cat /etc/nginx/nginx.conf > /data/nginx/nginx.conf
#将nginx配置文件nginx.conf复制到主机/data/nginx目录中

docker run --name nginx \
-v /data/www:/usr/local/html \
-v /data/nginx/conf.d:/etc/nginx/conf.d \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
--net=host \
-d nginx
#创建nginx

docker run --name php-fpm \
-v /data/www:/var/www/html \
-d php:7.1-fpm
#创建php
#查看php ip
docker inspect php-fpm --format='{{.NetworkSettings.IPAddress}}'

# 返回 IP
172.17.0.2

vim /data/nginx/conf.d/default.conf

server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}

location ~ \.php(.*)$ {
root /var/www/html; # php 容器的目录,进 php 容器查看
fastcgi_pass 172.17.0.2:9000; # php 容器的IP
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

}# 创建 Nginx 配置文件

docker restart nginx #重启nginx容器

docker ps

image-20220618215744707

测试

echo "" > /data/www/info.php
curl http://127.0.0.1/info.php

创建 MySQL 容器

docker run --name mysql \
-p 3306:3306 \
-v /data/mysql/conf.d:/etc/mysql/conf.d \
-v /data/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

安装php扩展
# 进入容器
docker exec -it php-fpm /bin/bash

# 安装 pdo_mysql mysqli
docker-php-ext-install pdo_mysql mysqli

# CTRL + D 退出容器
docker restart php-fpm

连接 MySQL测试

docker inspect mysql --format='{{.NetworkSettings.IPAddress}}'
查看mysql的ip
# 返回 IP
172.17.0.3

编辑连接测试文件

vim /data/www/conn.php

$serve = '172.17.0.3:3306';
$username = 'root';
$password = '123456';
$dbname = 'mysql';

$mysqli = new Mysqli($serve,$username,$password,$dbname);

if ($mysqli->connect_error) {
die('connect error:'.$mysqli->connect_errno);
}

$mysqli->set_charset('UTF-8');
$result = $mysqli->query('select * from user');
$data = $result->fetch_all();
print_r($data);

?>

curl http://127.0.0.1/conn.php #测试

image-20220618220150884


nginx加固


nginx作为优秀的正反向代理web服务器,多线程,高并发等特点。顺便记下正反向代理,代理客户端就是正向,反之代理服务端就是反向代理。另外正向代理可以作为上网行为管理;反向代理除了负载均衡,暴露的是代理服务器在公网的IP,隐藏了内网web服务器


image-20220618190102382


限制目录访问

vi /etc/nginx/nginx.conf 在HTTP模块增加 autoindex off; 因为nginx会自动下载web目录下的文件,增加威胁暴露面。

隐藏版本信息

vi /etc/nginx/nginx.conf 在HTTP模块增加server_tokens off 隐藏版本信息,如HTTP响应里就看不到了。这里得重启,重新载入配置不管用。

限制HTTP请求方法

vi /etc/nginx/conf.d/default.conf 在server模块增加
if ($request_method !~* GET|POST|HEAD) {
return 403;
} //拒绝除了get|post|head外的请求方式

nginx权

vi /etc/nginx/nginx.conf 增加 user nobody; 这样就算web服务权限失陷,也不会是root权限。这还涉及运维知识,nobody是Linux用来执行服务主进程之外进程的用户,为了达到失少不失全效果,若一开始用root部署的nginx,做好了负载均衡,后边重启服务每次都要root,麻烦;而且想换了,还会导致缓存访问权限不足进而进程缓慢,服务瘫痪等后患。

限制IP访问

编辑nginx.conf配置文件(vi /etc/nginx/nginx.conf ),在server标签内添加如下内容:
location / {
deny ip;
allow ip;
}

防盗链

编辑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;
}
}

补丁更新

nginx -v #查看版本信息
nginx -t #查看配置文件
然后选择补丁

php加固


php-fpm降权

修改/etc/php-fpm.d/www.conf,将 user = apache group = apache,改为 user = nobody group = nobody

安全模式

5.3以后没有了


禁用不安全的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函数就失效了。

关闭错误日志

vi /etc/php.ini
display_errors = Off
#避免报错暴露物理路径造成的文件上传或者sql报错注入、getshell。之前i春秋的ctf初级训练营里有一个就是利用PHP报错查看到数据库版本吧好像。

启用HTTPOnly

vi /etc/php.ini
session.COOKIE_httpOnly= 1
通过document盗用COOKIE预防XSS,但是可以在socket层抓包程序进阶攻击。

关闭PHP信息

vi /etc/php.ini
expose_php = Off
这样设置在http请求里就看不到x-powered-by:php/5.4.16了

限制目录访问

vi /etc/php.ini
open_basedir = ./:/tmp:/home/www/配置的目录 坏处就是影响IO流

限制上传目录

vi /etc/php.ini
upload_tmp_dir = /tmp定义的上传目录,防止目录穿越。

image-20220618191715130

image-20220618191757423

image-20220618193249442



推荐阅读
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 达人评测 酷睿i5 12450h和锐龙r7 5800h选哪个好 i512450h和r75800h对比
    本文介绍了达人评测酷睿i5 12450h和锐龙r7 5800h选哪个好的相关知识,包括两者的基本配置和重要考虑点。希望对你在选择时提供一定的参考价值。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
author-avatar
mobiledu2502929493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有