首页
留言
友情链接
壁纸
更多
关于
Search
1
dockerfile怎么执行shell脚本(利用tail -f /dev/null命令防止container启动后退出)
4,973 阅读
2
channel常见的异常总结
4,263 阅读
3
支付宝支付配置开发流程
1,409 阅读
4
HTTP 协议中的Content-Encoding
1,268 阅读
5
Laravel底层原理(二) —— 契约(Contracts)
942 阅读
PHP
composer
laravel
swoole
Docker
Linux
Go
随笔
mysql
nginx
Search
标签搜索
gopher
Docker
PHP
dockerfile
通道
go
defer
alipay
支付
git
phpstorm
IDEA
web安全
漏洞
socket
Royal
累计撰写
35
篇文章
累计收到
0
条评论
首页
栏目
PHP
composer
laravel
swoole
Docker
Linux
Go
随笔
mysql
nginx
页面
留言
友情链接
壁纸
关于
搜索到
35
篇与
Royal
的结果
2022-07-05
常见的web服务器安全加固方案
常见的web服务器安全加固,以nginx和apache为例nginx安全加固在Nginx中禁用server_tokens指令,隐藏nginx错误页面显示的当前版本,避免由特定版本发起的漏洞攻击 #隐藏版本号 server_tokens off;隐藏Nginx后端服务X-Powered-By头proxy_hide_header X-Powered-By; proxy_hide_header Server;nginx进程启动账号修改为非root,降低攻击概率user www www;把控配置文件权限以抵御外来攻击修改Nginx配置文件权限:执行chmod 644 <conf_path>来限制Nginx配置文件的权限;(<conf_path>为配置文件的路径,表示拥有者有读取+写入权限,同组用户和其他用户只有读取权限上传文件大小限制10M(或者更小,根据需求而定)以内client_max_body_size 10m;在Nginx中禁用不需要的HTTP方法if ($request_method !~ ^(GET|POST)$) { return 403 'Method Forbidden'; }Nginx自定义404错误当静态资源不存在时error_page 404 @jump_to_error; location @jump_to_error { return 404 'Not Found Page'; }apache安全加固严格设置配置文件和日志文件的权限,防止未授权访问执行chmod 600 /etc/httpd/conf/httpd.conf命令设置配置文件为属主可读写,其他用户无读写权限 执行chmod 644 /var/log/httpd/*.log命令设置日志文件为属主可读写,其他用户拥有只读权限禁止Apache访问Web目录之外的任何文件Order Deny,Allow Deny from all禁止目录列出目录列出会导致明显信息泄露或下载,建议禁止Apache列表显示文件。在/etc/httpd/httpd.conf配置文件中删除Options的Indexes设置即可。如果根目录没有index.html入口文件会把目录列出来#Options Indexes FollowSymLinks #删掉Indexes 或者 Options -Indexes 隐藏Apache的版本号修改httpd.conf配置文件:apache2的配置文件中(/etc/apache2/conf-enabled)ServerSignature Off ServerTokens Prod关闭TRACE功能关闭TRACE功能,防止TRACE方法被访问者恶意利用在/etc/httpd/conf/httpd.conf配置文件中添加以下设置参数:TraceEnable Off禁用非法 HTTP 方法修改httpd.conf配置文件,只允许get、post方法。<Location /> <LimitExcept GET POST CONNECT OPTIONS> Order Allow,Deny Deny from all </LimitExcept> </Location>自定义403错误ErrorDocument 403 "Method Forbidden"Apache自定义404错误当静态资源不存在时ErrorDocument 404 “自定义错误”
2022年07月05日
403 阅读
0 评论
0 点赞
2022-06-23
浅谈docker的几种网络模式
最近项目在做安全加固的时候突然遇到一个问题,一共三个板卡,每个板卡上面部署了三套执行体(php,java,python各一套),要求同一个板卡上面的三个执行体的容器彼此之间隔离,不能互相通信,也不能使用ping命令。解决这个问题之前,我们先了解下docker的网络通信模式有哪些?docker容器的通信模式分类通过命令查看docker安装后默认的网络模式列表docker network ls通过打印发现一共包含bridge桥接模式,host主机模式、none三种默认的模式,其实还有另外两种是默认不显示的,需要手动定以后,才能通过docker network ls命令查看才会显示出来!模式名称简介备注bridge容器拥有独属于自己的虚拟网卡和和虚拟IP等网络资源,它们分别通过docker0虚拟网卡与宿主机的eth0网卡交互,进而和外界网络交互默认模式host容器没有自己的任何独立的网络资源(比如:容器的IP、网卡和端口),完全和宿主机共享网络空间弊端:同一个端口只能同时被一个容器服务绑定none该模式关闭了容器的网络功能,仅有独自的网络空间(一个空架子),并且该模式不会给容器分配任何网络资源,包括虚拟网卡、路由、防火墙、IP、网关、端口等光秃秃的一个容器,没有任何的网络资源,就是自娱自乐的光杆司令(很少用)container它是bridge和host模式的合体,优先以bridge方式启动启动第一个容器,后面的所有容器启动时,均指定网络模式为container,它们均共享第一个容器的网络资源,除了网络资源,其他资源,容器彼此之间依然是相互隔离的第一个以bridge方式启动的容器服务挂掉,后面依赖它的容器,都暂停服务自定义该模式也更为灵活,可以通过-d 指定自定义的网络模式的类型,可以是bridge或者overlay,其中overlay功能更为强大,可以指定多个subnet子网网段。该模式,在容器之间使用别名相互通信,有着举足轻重的作用(重要)通过这个表我们发现,docker的容器的通信模式一共有5种,默认采用的是bridge桥接模式,我们再来看下这5种模式怎么使用。网络模式的使用方式docker run 后面添加 --net参数即可。--net=bridge 采用桥接方式--net=host 采用主机模式--net=container 采用容器模式--net=none 采用独立的无网络模式该采用哪种模式才能实现容器之间的隔离我们先来看下目前我们采用的哪种网络模式,通过docker inspect打印容器信息,发现我们容器运行模式位host模式。通过启动命令我们也能发现我们采用了host主机模式docker run -dit --net=host --privileged=true --restart=always --name=debian_nginx_ci_v1 -e MIMIC_BRACKET_HOST="32.60.90.42" -e MIMIC_BRACKET_PORT="8091" debian_nginx_ci:v1什么是主机模式呢?主机模式意味着容器和宿主机共享Network namespace从上图可以看出,如果在启动容器后使用的是host模式,那么这个容器将不会获得一个独立的Network Namespace(网络命名空间),而是和宿主机系统共用一个Network Namespace。并且这就意味着容器将不会虚拟出自己的网卡以及配置自己的ip等,而是使用宿主机的ip以及端口。不过呢,在其他方面例如文件系统等还是与之隔离的。这种方式最大优势在于网络性能比较好,网络传输速率高。但是缺点也很明显——网络的隔离性很弱。而且这种host模式还有个最大的劣势就是容器的端口不能重复占用,一旦宿主机上某个端口被占用,那么容器就不能在使用。比如宿主机上有个nginx占用了80,那么容器的nginx就不能在使用80端口了。因此这种方式是无法实现我们开篇说的容器彼此之间隔离,不能互相通信,也不能使用ping命令的需求。我们再来看下container模式满足么?它是bridge和host模式的合体,优先以bridge方式启动启动第一个容器,后面的所有容器启动时,均指定网络模式为container,它们均共享第一个容器的网络资源, 除了网络资源 ,其他资源,容器彼此之间依然是相互隔离的很显然这种方式也不行!!那么只剩下最后一种bridge模式了什么是bridge模式?该模式就是我们在启动docker服务后默认的docker网络模式,其会在主机上创建一个名为docker0的虚拟网桥,这个主机上的所有启动的容器就会连接到这个虚拟网桥上。docker0和自定义网络肯定不通,我们是使用自定义网络的好处就是网络隔离:bridge模式的使用 我们先通过自定义创建网络的方式,创建一个php的网络,指定子网、IP地址范围、网关等网络配置docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 php通过docker network ls查看是否创建成功可以看到多了一个php的网络,查看自定义网络细节docker network inspect php注:如果创建网络时候报以下错误,是因为docker服务启动之后开启了防火墙需要重启docker服务systemctl restart firewalld.service然后我们再用同样的方法创建一个python服务的网络如果在创建的过程中报Error response from daemon: Pool overlaps with other one on this address space 说明网段被占用,换一个网段即可。然后分别启动php的容器和python的容器并指定到对应的网络docker run -dit --net=php --privileged=true --restart=always --name=ubuntu_apache_ci_v1 -e MIMIC_BRACKET_HOST="33.60.90.43" -e MIMIC_BRACKET_PORT="8091" ubuntu_apache_ci:v1 docker run -dit --restart=always --net=python --privileged=true --name=cm_ca_env cm_ca_env:v1我们先进入php的服务容器中拿到对应的ip地址如下:可以看到php的容器的ip地址为192.168.0.2/16再进入到python的服务容器中,通过curl方式和ping的方式来请求php的服务发现都是不通的。我们再来验证下,同一网络内的容器是否互通呢?我们把python的服务删掉,然后重新启动使用php的网络。进入到容器中再试下结果:总结 可以看到,在python的容器中不管是连接php的服务还是自己容器内的服务都是想通的,因此得出结论,如果需要保证同一宿主机上的容器彼此服务隔离必须采用bridge的模式,并且不能使用同一自定义网络(同一网段)。Docker网络bridge桥接模式,是创建和运行容器时默认模式。这种模式会为每个容器分配一个独立的网卡,桥接到默认或指定的bridge上,同一个Bridge下的容器下可以互相通信的。我们也可以创建自定义bridge以满足个性化的网络需求,保证了一个容器代码被篡改,不会波及到其他服务。解决bridge模式下外网访问问题 我们先来看下bridge模式下的一些特性:docker run 命令不带--net参数时,默认就是桥接模式。桥接模式下容器的虚拟IP,容器内部彼此之间可以访问,非宿主机的其他其他主机无法直接访问容器内部的服务。桥接模式下,虽然外界主机不能直接访问宿主机容器内部的服务,但是可以通过间接方式访问宿主机docker run -p时,对外暴露的映射端口。因此使用-p 宿主机端口:容器端口映射的方式,通过访问宿主机端口而不能直接访问容器端口的形式来访问!
2022年06月23日
514 阅读
0 评论
0 点赞
2022-06-01
如何在docker容器启动时动态更换项目中的配置项
需求最近在部署项目时发现项目代码中有依赖的其他服务的ip和端口号,但是需要部署在三台不同的服务器上,每台服务器上的ip地址和端口号都不一样,这就需要打包三份不同的镜像分别部署,那有没有其他办法来完成动态更改呢?当然有,只需要以下四步搞定。dockerfile的环境变量我们首先想到了dockerfile里面有个关键词ENV,官方给的解释是如下:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。格式:ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...首先我们在dockerfile编写时设置环境变量,比如我要把ip和端口定义环境变量如下:# base image FROM ubuntu_apache_ci:latest # MAINTAINER MAINTAINER sangshuaidong <sangshuaidong@comleader.com.cn> RUN rm -rf /home/wwwroot/default/* \ && rm -rf /home/wwwroot/ci.localhost.com/* \ && rm -rf /usr/local/apache/conf/httpd.conf \ && rm -rf /usr/local/php/etc/php.ini \ && rm -rf /usr/local/apache/conf/extra/httpd-vhosts.conf # COPY COPY ci.localhost.com/ /home/wwwroot/ci.localhost.com/ COPY ["start.sh", "/root/start.sh"] COPY ["httpd.conf", "/usr/local/apache/conf/httpd.conf"] COPY ["httpd-vhosts.conf", "/usr/local/apache/conf/extra/httpd-vhosts.conf"] COPY dist* /home/wwwroot/default/ ENV MIMIC_BRACKET_HOST 192.168.22.113 ENV MIMIC_BRACKET_PORT 8091 RUN chmod -R 777 /home/wwwroot/ \ && chmod -R 777 /root/start.sh WORKDIR /root #CMD CMD ["/bin/bash","./start.sh"] EXPOSE 8000 443 9000 上面我们定义了两个环境变量MIMIC_BRACKET_HOST和MIMIC_BRACKET_PORT,这样我们就可以容器中使用,在配置文件中使用唯一变量名替代比如我们的项目配置文件在config文件夹下,我们把我们的配置项参数值修改为唯一名MIMIC_BRACKET_HOST_ENV和MIMIC_BRACKET_PORT_ENV,要确保这个名字在改文件内为唯一的这样才能方便我们后面替换!!在启动脚本文件内使用正则表达式进行环境变量替换sed -i -e "s#MIMIC_BRACKET_HOST_ENV#${MIMIC_BRACKET_HOST}#" /home/wwwroot/ci.localhost.com/application/config/access.php sed -i -e "s#MIMIC_BRACKET_PORT_ENV#${MIMIC_BRACKET_PORT}#" /home/wwwroot/ci.localhost.com/application/config/access.php 上面的意思就是把配置文件内的字符MIMIC_BRACKET_HOST_ENV和MIMIC_BRACKET_PORT_ENV换成我们镜像的环境变量完成以上几步就可以使用docker build构建镜像了,注意:大家在写dockerfile时尽量遵循规则,避免重复多层,因为每一条命令在构建时就会新增一层,层数越大镜像自然也就越大!启动容器docker run -dit --net=host --privileged=true --name=ubuntu_apache_ci_v1 -e MIMIC_BRACKET_HOST="1.1.1.1" -e MIMIC_BRACKET_PORT="8888" ubuntu_apache_ci:v1使用-e 参数 把我们要修改的变量通过参数传递进去,如果不指定参数的话,默认就会按照dockerfile里面的默认值。我们进去容器看下效果:docker exec -it adb67edebffd /bin/bash 可以看到配置项已经更改,这样就可以解决我们在不同服务器上使用同一套镜像了,避免了频繁修改配置参数重复打包的工作!
2022年06月01日
525 阅读
0 评论
0 点赞
2022-04-24
【Gopher】go语言开发环境配置goproxy(三)
在开发过程中,有时会经常遇到有些包无法完成下载的情况,网址由于墙的原因可能无法访问这时候就需要配置goproxy代理。通过go env查看默认的GOPROXY代理是官方的路径需要换成国内的代理地址。配置goproxy阿里代理go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct // Windows export GOPROXY=https://mirrors.aliyun.com/goproxy/,direct // macOS 或 Linux七牛云代理go env -w GOPROXY=https://goproxy.cn,direct // Windows export GOPROXY=https://goproxy.cn,direct // macOS 或 Linux 注意Go 1.13设置了默认的GOSUMDB=sum.golang.org,是用来验证包的有效性。这个网址由于墙的原因可能无法访问,所以可以使用下面命令来关闭:go env -w GOSUMDB=off // Windows export GOSUMDB=off // macOS 或 Linux 现在再用go build执行编译 就可以正常下载依赖包!回头发现 go的安装环境需要配置三个路径:GOROOT:go的安装目录GOPATH:项目工作目录GOPROXY:代理地址
2022年04月24日
826 阅读
0 评论
1 点赞
2022-04-21
【Gopher】go语言开发环境安装(一)
安装环境是一个程序员的必修课程,好多人学习编程都是从环境安装入门到放弃。下面我们看下go的开发环境是怎么安装的,以Linux操作系统为例:1. 安装包下载 打开下载地址:https://golang.google.cn/dl/选择最新的安装包 go1.18.1.linux-amd64.tar.gz 2. 上传解压安装包 cd /usr/local/ 重点讲下为什么要到local目录,我们发现很多安装包都是默认在/usr/local目录下面的,包括nginx、php、protobuf等等Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的/usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32。/usr/local:用户级的程序目录,可以理解为C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。/opt:用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。源码放哪里?/usr/src:系统级的源码目录。/usr/local/src:用户级的源码目录然后我们通过rz -b命令 把我们下载的go安装包上传到服务器中最后通过 tar -zxvf go1.18.1.linux-amd64.tar.gz解压安装包3. 建立Go的工作空间 (俗称就是我们写的代码存放的地方,workspace,也就是GOPATH环境变量指向的目录)GO代码必须在工作空间内。工作空间是一个目录,其中包含三个子目录:src ---- 里面每一个子目录,就是一个包。包内是Go的源码文件pkg ---- 编译后生成的,包的目标文件bin ---- 生成的可执行文件这里,我们在/home目录下, 建立一个名为goproject的文件夹cd /home/ mkdir goproject cd goproject/ mkdir bin mkdir src mkdir pkg4. 添加PATH环境变量and设置GOPATH环境变量vi /etc/profile加入下面这三行:export GOROOT=/usr/local/go ##Golang安装目录 export PATH=$GOROOT/bin:$PATH ##Golang bin目录 export GOPATH=/home/goproject ##Golang项目目录 工作目录保存后,执行以下命令,使环境变量立即生效: source /etc/profile ##刷新环境变量5. 验证一下环境是否安装成功go version ##查看go版本6. 查看Go语言的环境信息go env可以看到 gopath和goroot的配置信息!环境搭建OK!
2022年04月21日
271 阅读
0 评论
0 点赞
1
2
3
...
7