锦州市广厦电脑维修|上门维修电脑|上门做系统|0416-3905144热诚服务,锦州广厦维修电脑,公司IT外包服务
topFlag1 设为首页
topFlag3 收藏本站
 
maojin003 首 页 公司介绍 服务项目 服务报价 维修流程 IT外包服务 服务器维护 技术文章 常见故障
锦州市广厦电脑维修|上门维修电脑|上门做系统|0416-3905144热诚服务技术文章
使用Docker构建安全的虚拟空间

作者: 佚名  日期:2018-10-10 16:12:10   来源: 本站整理

 最近上的某水课的作业是出 ctf web题目,然而大多数同学连 php 都没学过,(滑稽)更别说配置服务器了,于是我想能不能趁机赚一波外快 造福一下同学,(其实就是想折腾了)。所以打算把我自己的 vps 分成虚拟空间给大家用。但是一般的虚拟空间安全性难以得到保证,一个空间出问题,其他的用户可能都跟着遭殃,也就是旁站攻击。更何况我们这个虚拟空间的用处是 ctf web 题目,总不能让人做出一道题目就能顺手拿到所有题目的 flag 吧。于是想到了使用 docker 来构建安全的虚拟空间,其间遇到了不少问题,下面就是折腾的过程了。

实现思路
大体的思路是,在我的 vps 上为每个用户创建一个文件目录,然后将目录挂载到 docker 容器的默认网站目录,也就是/var/www/html,,用户可以通过 FTP 将网站源码上传到自己的文件目录,文件也会同步到容器内。这样就实现了各个空间的环境隔离,避免旁站攻击。
而数据库则可以单独构建一个 mysql 容器,为每个用户分配一个 user&database,让用户和空间容器来远程连接。
前期准备
选择镜像:
空间使用的镜像为:mattrayner/lamp:latest-1604 (ubuntu 16.04 + apachd2 + mysql,其实只要有mysql-client 就可以了)
数据库所使用的镜像为: mysql:5 (mysql 官方镜像)
配置FTP:
和配置常规的 FTP 没什么区别,这里特别强调3点:
一定要开启 ch_root,防止不同用户之间可以互相查看文件;
如果使用被动模式,那么 云主机的安全组 或者iptables 不要忘了放行端口;
将 umask 设置为 022 (保证用户上传的文件默认权限为755。
选择一个位置存放用户文件夹:
我这里新建一个 ~/rooms/ 来存放用户的文件夹。
配置数据库:
1. 网络:
要让虚拟空间的容器能够远程连接数据库,首先要使容器之间在一个网段,那么我们就需要设置一个桥接模式的 docker network,我这里使用 172.22.0.0/16 这个网段。
$ docker network create --driver = bridge --subnet = 172 .22.0.0/16 room_net
2.创建 MySQL 容器:
我们的数据库需要满足:
允许用户远程连接;
允许空间容器连接。
第一点要求,我们通过将数据库容器的 3306 端口映射到 VPS 的开放端口即可,我这里映射到 3307。
第二点要求,只要通过我们刚刚设置的 docker network 即可实现。
所以启动创建容器的命令是的命令是:
$ docker run -d --name room-mysql --network room_net --ip 172 .22.0.1 -p 3307 :3306 -e MYSQL_ROOT_PASSWORD = your_password mysql:5
值得注意的一点是,root 用户是不需要远程登录的,出于安全考虑,我们应该 禁止其通过localhost意外的host登录
执行:
$ docker exec -it room-mysql /bin/bash -c "mysql -u root -p -e\"use mysql;update user set host='localhost' where user='root';drop user where user='root' and host='%';flush privileges;\""
创建空间过程
做好前期的准备工作,我们就可以开始构建空间了,出于方便我们将整个过程编写成 shell 脚本,这样以后要新建空间的时候,只需要运行一下就可以了。
我们创建空间需要以下几个步骤:
1. 创建新的 FTP 用户
这个用户应该满足这样的要求:
可以上传文件到虚拟空间用户文件夹 (废话);
不能访问除虚拟空间用户文件夹之外的位置 (在配置 FTP 时通过ch_root 实现);
创建的时候设置一个随机密码;
不能通过 ssh 登陆 (其实这也是用户能通过 ftp 连接 的必须条件。如果不限制的话,ftp登录时会出现 530 错误。
那么对应的 shell 脚本就是:
#/home/ubuntu/rooms/ 即你的vps上用来存放用户文件夹的位置  # $1 参数为要设置的用户名,也是虚拟空间容器&数据库用户&数据库&用户文件夹的名字useradd -g ftp -d /home/ubuntu/rooms/$1 -m $1 ​pass=`cat /dev/urandom | head -n 10 | md5sum | head -c 10`  #生成随即密码echo $1:$pass | chpasswd                                    #为用户设置密码​#限制用户通过 ssh 登录(如/etc/shells 里没有/usr/sbin/nologin 需要自己加进去usermod -s /usr/sbin/nologin $1             echo "create ftp user:$1 indentified by $pass"              #输出用户名和密码
2. 新建数据库用户&数据库,并为用户赋权
这部分操作比较简单,我们就只需要为用户新建一个 MySQL 账户和一个专属数据库就好了。
shell 脚本:
# 让用户输入 mysql 容器的 root 密码read -sp "请输入 MySQL 容器的 root 账户密码:" mysql_pass# 创建数据库docker exec -it mysql-docker /bin/bash -c "mysql -u root -p$mysql_pass -e \"create database $1;\""# 生成密码pass=`cat /dev/urandom | head -n 10 | md5sum | head -c 10`# 创建 MySQL 用户docker exec -it mysql-docker /bin/bash -c "mysql -u root -p$mysql_pass -e \"CREATE USER '$1'@'%' IDENTIFIED BY '$pass';\""# 为用户赋予权限docker exec -it mysql-docker /bin/bash -c "mysql -u root -p$mysql_pass -e \"grant all privileges on $1.* to '$1'@'%';flush privileges;\""# 输出账户信息echo "create database user:$1@'%' indentified by $pass"
3. 新建空间
到现在我们已经可以创建空间容器了,想一想这个空间要满足什么基本要求呢?
能够外网访问;



热门文章
  • 机械革命S1 PRO-02 开机不显示 黑...
  • 联想ThinkPad NM-C641上电掉电点不...
  • 三星一体激光打印机SCX-4521F维修...
  • 通过串口命令查看EMMC擦写次数和判...
  • IIS 8 开启 GZIP压缩来减少网络请求...
  • 索尼kd-49x7500e背光一半暗且闪烁 ...
  • 楼宇对讲门禁读卡异常维修,读卡芯...
  • 新款海信电视机始终停留在开机界面...
  • 常见打印机清零步骤
  • 安装驱动时提示不包含数字签名的解...
  • 共享打印机需要密码的解决方法
  • 图解Windows 7系统快速共享打印机的...
  • 锦州广厦电脑上门维修

    报修电话:13840665804  QQ:174984393 (联系人:毛先生)   
    E-Mail:174984393@qq.com
    维修中心地址:锦州广厦电脑城
    ICP备案/许可证号:辽ICP备2023002984号-1
    上门服务区域: 辽宁锦州市区
    主要业务: 修电脑,电脑修理,电脑维护,上门维修电脑,黑屏蓝屏死机故障排除,无线上网设置,IT服务外包,局域网组建,ADSL共享上网,路由器设置,数据恢复,密码破解,光盘刻录制作等服务

    技术支持:微软等