Open lmk123 opened 3 years ago
三年前,在某某云的活动下,我买了一台服务器,吃灰两年后居然派上了用场。最近我重装了这台服务器,在网上查了一下,国内似乎用 Centos 的比较多,于是装了 Centos 8.0 系统(但是我最近关注到 Centos 8.0 再过两年就不维护了……算了先装上去再说),然后放了一个星期,今天再 ssh 登录上去的时候,看到了这条消息:
There were 5600 failed login attempts since the last successful login.
也就是从这条消息开始,我的运维生涯开始了……
出现这条消息的原因是我在安装系统的时候用了 root 用户 + 密码登录的方式,所以有人一直在尝试暴力破解我的密码。虽然可能没有被猜中密码,但我还是重装了服务器。我仍然用了 Centos 8.0 系统,但是我默认使用了密匙登陆的方式,并关闭了密码登录方式。
虽然云服务器提供商支持使用网页的方式登录到服务器,但是还是用电脑的终端更方便一些。我使用的是 Windows 系统,好在 Windows 现在已经支持 Linux 子系统了。在 PowerShell 中输入 wsl 就可以切换到 Linux 子系统的终端,然后就可以使用 Bash 连接到服务器了。
wsl
现在 WSL 已经是版本 2 了,但是我安装的时候还是版本 1。在 PowerShell 运行 wsl -l -v 的时候会看到我的 Ubuntu 运行的是 WSL 1:
wsl -l -v
> wsl -l -v NAME STATE VERSION * Ubuntu Stopped 1
可以去这里下载内核更新包:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package
安装完成后运行下面的命令进行升级:
> wsl --set-version Ubuntu 2 正在进行转换,这可能需要几分钟时间... 有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2 转换完成。
我的应用是用 Docker 和 Docker Componse 开发的,部署我也决定用这一套。
在 Centos 安装 Docker 的步骤:https://docs.docker.com/engine/install/centos/
安装 Docker Compose 的步骤:https://docs.docker.com/compose/install/
按照文档的步骤来就行。
为了让应用支持使用 https 的方式访问,我还需要给 limingkai.cn 创建一个泛域名证书。我使用了 acme.sh 来创建证书,另外,acme.sh 还提供了 Docker 镜像的使用方式。
我一开始本来打算将这个镜像集成到我应用的 compose.yaml 里,但是在看了文档 Deploy certs from a container to another container 之后,我发现即使集成到了 compose.yaml 里,还是要运行几个 docker exec 命令进行创建操作,所以我打算将 acme.sh 作为一个单独的容器来维护,我的应用只需要从它的 volume 里读取生成好的证书就可以了。
docker exec
首先,按照 Run acme.sh as a docker daemon 的方式创建 acme.sh 的容器:
docker run --rm -itd \ -v acme:/acme.sh \ --net=host \ --name=acme.sh \ neilpang/acme.sh daemon
简单解读一下这条命令:Docker 基于镜像 neilpang/acmesh 创建了一个名为 acme.sh 的容器,这个容器将生成的证书文件夹保存在了名为 acme 的 volume 当中。
acme
运行成功后,可以看到容器已经在运行了:
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1d609a8b0a9d neilpang/acme.sh "/entry.sh daemon" 7 seconds ago Up 6 seconds acme.sh
名为 acme 的 volume 也自动创建了:
$ docker volume inspect acme [ { "CreatedAt": "2020-12-22T18:21:41Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/acme/_data", "Name": "acme", "Options": null, "Scope": "local" } ]
然后,运行下面的命令在这个容器中生成证书:
docker exec \ -e DP_Id=xxx \ -e DP_Key=xxx \ acme.sh --issue --dns dns_dp -d *.limingkai.cn
最后,修改应用的 compose.yaml,用于从名为 acme 的 volume 当中读取证书文件:
services: app: volumes: - type: volume source: acme target: /app/acme volumes: acme: external: true
用 docker-compose 运行应用之后,我们就可以在 app 这个容器里看到证书了:
$ docker-compose exec app ls acme/*.limingkai.cn *.limingkai.cn.cer *.limingkai.cn.conf *.limingkai.cn.csr *.limingkai.cn.csr.conf *.limingkai.cn.key ca.cer fullchain.cer
这样,当应用启动时,只需要在这个文件夹下找到证书就可以了。
这种方式有一个不好的问题就是:当 acme.sh 自动给证书续期后,我的应用不会自动重启。但目前我不需要考虑这一点,毕竟我应该不可能 90 天都不更新我的应用。
三年前,在某某云的活动下,我买了一台服务器,吃灰两年后居然派上了用场。最近我重装了这台服务器,在网上查了一下,国内似乎用 Centos 的比较多,于是装了 Centos 8.0 系统(但是我最近关注到 Centos 8.0 再过两年就不维护了……算了先装上去再说),然后放了一个星期,今天再 ssh 登录上去的时候,看到了这条消息:
也就是从这条消息开始,我的运维生涯开始了……
配置 ssh
出现这条消息的原因是我在安装系统的时候用了 root 用户 + 密码登录的方式,所以有人一直在尝试暴力破解我的密码。虽然可能没有被猜中密码,但我还是重装了服务器。我仍然用了 Centos 8.0 系统,但是我默认使用了密匙登陆的方式,并关闭了密码登录方式。
在 Windows 系统下使用 Bash
虽然云服务器提供商支持使用网页的方式登录到服务器,但是还是用电脑的终端更方便一些。我使用的是 Windows 系统,好在 Windows 现在已经支持 Linux 子系统了。在 PowerShell 中输入
wsl
就可以切换到 Linux 子系统的终端,然后就可以使用 Bash 连接到服务器了。现在 WSL 已经是版本 2 了,但是我安装的时候还是版本 1。在 PowerShell 运行
wsl -l -v
的时候会看到我的 Ubuntu 运行的是 WSL 1:可以去这里下载内核更新包:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package
安装完成后运行下面的命令进行升级:
安装 Docker 和 Docker Componse
我的应用是用 Docker 和 Docker Componse 开发的,部署我也决定用这一套。
在 Centos 安装 Docker 的步骤:https://docs.docker.com/engine/install/centos/
安装 Docker Compose 的步骤:https://docs.docker.com/compose/install/
按照文档的步骤来就行。
使用 acme.sh 生成 https 证书
为了让应用支持使用 https 的方式访问,我还需要给 limingkai.cn 创建一个泛域名证书。我使用了 acme.sh 来创建证书,另外,acme.sh 还提供了 Docker 镜像的使用方式。
我一开始本来打算将这个镜像集成到我应用的 compose.yaml 里,但是在看了文档 Deploy certs from a container to another container 之后,我发现即使集成到了 compose.yaml 里,还是要运行几个
docker exec
命令进行创建操作,所以我打算将 acme.sh 作为一个单独的容器来维护,我的应用只需要从它的 volume 里读取生成好的证书就可以了。首先,按照 Run acme.sh as a docker daemon 的方式创建 acme.sh 的容器:
简单解读一下这条命令:Docker 基于镜像 neilpang/acmesh 创建了一个名为 acme.sh 的容器,这个容器将生成的证书文件夹保存在了名为
acme
的 volume 当中。运行成功后,可以看到容器已经在运行了:
名为
acme
的 volume 也自动创建了:然后,运行下面的命令在这个容器中生成证书:
最后,修改应用的 compose.yaml,用于从名为
acme
的 volume 当中读取证书文件:用 docker-compose 运行应用之后,我们就可以在 app 这个容器里看到证书了:
这样,当应用启动时,只需要在这个文件夹下找到证书就可以了。
这种方式有一个不好的问题就是:当 acme.sh 自动给证书续期后,我的应用不会自动重启。但目前我不需要考虑这一点,毕竟我应该不可能 90 天都不更新我的应用。
参考文章