中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Docker使用 linuxserver/letsencrypt 生成SSL證書最全解析及實踐

2019-01-03    來源:importnew

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

本文使用 HTTP 和 DNS 兩種校驗方式對 Docker 下 linuxserver/letsencrypt 項目進行了實踐。生成SpringBoot可用證書,使用 Nginx 的 htpasswd 來對網(wǎng)站進行密碼保護,并測試使用 fail2ban 防止 htpasswd 被暴力破解。全文基于 linuxserver/letsencrypt 文檔及其他官方資料,根據(jù)作者實踐進行詳細(xì)解析和記錄。

1. 介紹

1.0 linuxserver/letsencrypt

這個容器設(shè)置了一個 Nginx 服務(wù)器,支持 PHP 的反向代理和一個內(nèi)置的 letsencrypt 客戶端,可以自動化生成或更新 SSL 服務(wù)器證書。它還包含用于防御入侵的 fail2ban。

1.1 使用

docker create \
  --cap-add=NET_ADMIN \
  --name=letsencrypt \
  -v <path to data>:/config \
  -e PGID=<gid> -e PUID=<uid>  \
  -e EMAIL=<email> \
  -e URL=<url> \
  -e SUBDOMAINS=<subdomains> \
  -e VALIDATION=<method> \
  -p 80:80 -p 443:443 \
  -e TZ=<timezone> \
  linuxserver/letsencrypt

1.2 參數(shù)

  • –cap-add=NET_ADMIN cap-add:即 Add Linux capabilities 添加 Linux 內(nèi)核能力。這里具體添加的能力是允許執(zhí)行網(wǎng)絡(luò)管理任務(wù)。這是因為 fail2ban 需要修改 iptables
  • -p 80 -p 443:端口
  • -v /config:包括 webroot 在內(nèi)的所有配置文件都保存在此處
  • -e URL:頂級域名(完全擁有則如:“customdomain.com”,動態(tài) DNS 則如 “customsubdomain.ddnsprovider.com” )
  • -e SUBDOMAINS:證書覆蓋的子域名 (逗號分隔,無空格) .如 www,ftp,cloud.對于通配符證書, 請將此明確地設(shè)置為通配符 (通配符證書只允許通過dns方式驗證)
  • -e VALIDATION:letsencrypt驗證方法,選項是 http、tls-sni 或者 DNS
  • 不同校驗方式的區(qū)別:
    • HTTP 校驗:需要使用到80端口,故宿主機80端口應(yīng)該轉(zhuǎn)發(fā)到容器的80端口
    • tls-sni 校驗:需要使用到443端口,故宿主機443端口應(yīng)該轉(zhuǎn)發(fā)到容器的443端口(注意:由于安全漏洞,letsencrypt 禁用了 tls-sni 驗證,使用該方式會報錯:Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA
    • DNS 驗證:需要設(shè)置 DNSPLUGIN 變量(不是所有的DNS服務(wù)商都支持),并且需要在 /config/dns-conf 文件夾下輸入憑據(jù)到相應(yīng)的 ini 文件里,當(dāng)無法通過端口驗證時可使用這種方法驗證
  • -e PGID 設(shè)置 GroupID
  • -e PUID 設(shè)置 UserID
  • -e TZ?- 時區(qū) 如?America/New_York:上海時區(qū)為Asia/Shanghai

通過指定用戶ID和所屬群的ID來避免數(shù)據(jù)卷掛載(-v)時容器和宿主機直接可能產(chǎn)生的權(quán)限問題。最好讓掛載的數(shù)據(jù)卷目錄的擁有者和指定的用戶統(tǒng)一。

另外,需要注意:不能指定root用戶(即PGID=0,PUID=0),否則會一直報錯(但不影響使用)。

#宿主機root用戶環(huán)境下使用例子(非官方,僅供參考)

#創(chuàng)建要掛載的目錄,此時該目錄屬root用戶和root組
mkdir /opt/letsencrypt
#創(chuàng)建docker用戶(默認(rèn)會順帶新建同名Group)
useradd dockeruser
#修改文件夾歸屬(R代表遞歸操作,文件夾下的也一并修改)
chown -R dockeruser:dockeruser /opt/letsencrypt
#查看dockeruser的用戶id和群id
id dockeruser

可選設(shè)置:

  • -e DNSPLUGIN:如果 VALIDATION 設(shè)置為 DNS 則此項必選。選項有 cloudflare、cloudxns、digitalocean、dnsimple、dnsmadeeasy、google、luadns、nsone、rfc2136 和 route53。還需要在 /config/dns-conf 文件夾下輸入憑據(jù)到相應(yīng)的 ini 文件里。這里推薦使用 cloudflare,免費而且好用.
  • 使用 Cloudflare 服務(wù)的話應(yīng)確保設(shè)置為 dns only 而非 dns + proxy(事實上 Cloudflare 的 proxy 已經(jīng)提供免費自動 SSL 服務(wù)了,也就沒有本文的必要)
  • Google DNS 插件的使用對象是企業(yè)付費產(chǎn)品“Google Cloud DNS”而非“Google Domains DNS”
  • -e EMAIL:您的證書注冊和通知的電子郵件地址
  • -e DHLEVEL:dhparams 位值(默認(rèn)值= 2048,可設(shè)置為1024或4096)
  • -p 80:VALIDATION設(shè)置為 http 而不是 dns 或 tls-sni 時需要80端口進行轉(zhuǎn)發(fā)
  • -e ONLY_SUBDOMAINS:僅為子域名獲取證書(主域名可能托管在另外一臺計算機且無法驗證)時請將此項設(shè)置為 true
  • -e EXTRA_DOMAINS:額外的完全限定域名(逗號分隔,無空格)如 extradomain.com,subdomain.anotherdomain.org
  • -e STAGING:設(shè)置為 true 可以提高速率限制,但證書不會通過瀏覽器的安全測試,僅用于測試
  • -e HTTPVAL:已棄用, 請用VALIDATION 代替

2. 實踐

2.1 使用 HTTP 方式驗證

首先,你應(yīng)該先保證要獲取證書的域名(子域名)能正確地訪問到主機。注意:域名需要備案。

這里我映射的宿主機目錄為 /opt/letsencrypt1,PGID 和 PUID 由上文提到的方式獲得。配置的域名為 my.com 和 www.my.com (實際上我配置的是另外一個我自己真正擁有的域名,這里不貼出來)

注意:使用 HTTP 方式驗證的話開發(fā)80端口就可以了,這里443端口也進行映射。這是為了證書獲取成功后可以通過使用 HTTPS 登錄該容器提供的默認(rèn)首頁進行確認(rèn)。

docker run -d \
--cap-add=NET_ADMIN \
--name=letsencrypt \
-v /opt/letsencrypt1:/config \
-e PGID=1002 -e PUID=1001  \
-e URL=my.com \
-e SUBDOMAINS=www \
-e VALIDATION=http \
-p 80:80 -p 443:443 \
-e TZ=Asia/Shanghai \
linuxserver/letsencrypt

容器會在后臺運行,這個時候應(yīng)該提供如下指令查看日志輸出(CTRL + z退出)

docker logs -f letsencrypt

最后,我卡在 Cleaning up challenges 這一步。這是因為我域名沒有備案,無法通過域名訪問到我所在的主機。這個時候打開域名鏈接被重定向到云主機提供商的網(wǎng)頁禁止訪問,Let’s encrypt 沒辦法通過域名訪問到本機,所以驗證失。ㄊ聦嵣纤矝]有說失敗,只是一直停在那里)。

毋庸置疑,我是因為這個原因被禁止訪問的。

既然 HTTP(80端口)方式驗證走不通,tls-sni本來就不行,那就只能用 dns 驗證了。

2.2 使用dns方式驗證

這里以CloudFlare為例

第一步 完成域名服務(wù)器配置

首先,要有一個 cloudflare 賬號。然后,在域名提供商那里將域名的 DNS 服務(wù)器改成 cloudflare 提供的 DNS 服務(wù)器。然后,在cloudflare那里添加對應(yīng)的解析記錄。

注意:解析記錄 Status 的圖標(biāo)應(yīng)該是灰色的,表示 DNS only。如果圖標(biāo)亮了,表示 DNS and HTTP proay(CDN),要使用 let’s encrypt 的 DNS 校驗的話就不要再開 HTTP 代理和 CDN 了。開了代理的話 cloudflare 會免費給你提供(及自動維護更新)SSL證書,就可以直接 HTTP 訪問了。不需要本文再干嘛了,而且還有免費 CDN,可謂十分良心。

第二步 完成域名服務(wù)器 API-KEY 相關(guān)配置并啟動

這一步先正常啟動,會啟動失敗但會生成所有的配置文件。再根據(jù)相應(yīng)的 ini 文件里的提示去域名服務(wù)器提供商那里找到相對應(yīng)的憑證,修改 ini 文件,重新啟動容器。

啟動如下。這次我映射到宿主機目錄 /opt/letsencrypt2 下,把 VALIDATION 改為 dns,增加 DNSPLUGIN 配置為 cloudflare。

docker run -d \
--cap-add=NET_ADMIN \
--name=letsencrypt \
-v /opt/letsencrypt2:/config \
-e PGID=1002 -e PUID=1001  \
-e URL=my.com \
-e SUBDOMAINS=www \
-e VALIDATION=dns \
-e DNSPLUGIN=cloudflare \
-p 80:80 -p 443:443 \
-e TZ=Asia/Shanghai \
linuxserver/letsencrypt

使用 docker logs -f letsencrypt 查看。
這次是在 Cleaning up challenges 之后報錯… 錯誤提示也很明確,是 Unknown X-Auth-Key or X-Auth-Email 的問題,配置是在 /config/dns-conf/cloudflare.ini?這個文件里面。

Cleaning up challenges
Error determining zone_id: 9103 Unknown X-Auth-Key or X-Auth-Email. Please confirm that you have supplied valid Cloudflare API credentials. (Did you enter the correct email address?)
IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
ERROR: Cert does not exist! Please see the validation error above. Make sure you entered correct credentials into the /config/dns-conf/cloudflare.ini file.

打開??/config/dns-conf/cloudflare.ini 可以看到

# Instructions: https://github.com/certbot/certbot/blob/master/certbot-dns-cloudflare/certbot_dns_cloudflare/__init__.py#L20
# Replace with your values
dns_cloudflare_email = cloudflare@example.com
dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567

感興趣的可以到介紹的頁面去查看相關(guān)信息,也可以直接到對應(yīng)域名解析服務(wù)提供商那里去看。cloudflare 查看的地址是 https://dash.cloudflare.com/profile,最上面是 Email,最下面是 API Keys。


將對應(yīng)內(nèi)容替換到?/config/dns-conf/cloudflare.ini 里面(即宿主機的 /opt/letsencrypt2/dns-conf/cloudflare.ini 里面)。然后,使用 docker rm -f letsencrypt 強制刪掉原容器。再重新運行上面的 docker run 就可以成功啟動了。

查看日志如下:


最終會停在 Server ready 這一行(如果用 root 用戶的 uid 和 gid 的話,現(xiàn)在會一直報錯,但仍可使用)。這個時候就可以用 HTTPS 打開了(內(nèi)置的 Nginx 只監(jiān)聽443端口,所以不能用 HTTP 打開),顯示如下界面即為正常。

 

3. 設(shè)置

3.1 安全和密碼保護

可以使用 Nginx 的 htpasswd 來對網(wǎng)站進行密碼保護。htpasswd 的相關(guān)用法可見?htpasswd命令。

  • 添加第一個密碼訪問用戶(-c?參數(shù)表示創(chuàng)建一個加密文件,如果原來有的話則把原來的刪掉)
docker exec -it letsencrypt htpasswd -c /config/nginx/.htpasswd <username>
  • 繼續(xù)添加密碼訪問用戶(把-c去掉即可)
docker exec -it letsencrypt htpasswd /config/nginx/.htpasswd <username>

如下為添加兩個用戶(lin 和 shen)

查看用戶信息文件(/opt/letsencrypt2 是我映射到容器 /config 的目錄)

然后,還需要在 Nginx 的配置文件(默認(rèn)為 /config/nginx/site-confs/default)里面開啟 auth_basic,如下:

location / {
    try_files $uri $uri/ /index.html /index.php?$args =404;
    # 將下列兩行放到location{}里面,**Restricted**是網(wǎng)站要求輸入賬號密碼時的提示語,后面是指定的用戶密碼文件路徑
    auth_basic "Restricted";
    auth_basic_user_file /config/nginx/.htpasswd;
}

最后要使用 docker restart letsencrypt 重新啟動容器使配置生效。登錄網(wǎng)站,提示如下(我用的是firefox,不同瀏覽器可能顯示不一樣)

3.2 站點配置和反向代理

3.2.1 默認(rèn)配置文件

默認(rèn)的站點配置文件位于 /config/nginx/site-confs/default?芍苯有薷拇宋募瓿膳渲,也可將其他的 conf 文件添加到此目錄。如果將 default 文件刪除的話,容器啟動時對其重新創(chuàng)建。

3.2.2 拒絕搜索引擎抓取

如果不希望網(wǎng)站被搜索引擎抓取,可以將以下命令添加到 /config/nginx 文件夾下的 ssl.conf 文件中。

add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

3.2.3 使用預(yù)設(shè)的配置文件

本容器已經(jīng)為熱門應(yīng)用添加了預(yù)設(shè)的反向代理配置文件,具體可以查看 /config/nginx/proxy_confs 文件夾下的 _readme 文件
/config/nginx/proxy_confs 文件夾下的預(yù)設(shè)反向代理配置文件有兩類:

  • .subfolder.conf : 這類型的配置文件將允許通過 https://yourdomain.com/servicename 的方式訪問配置文件對應(yīng)的服務(wù)
  • .subdomain.conf : 這類型的配置文件將允許通過 https://servicename.yourdomain.com 的方式訪問配置文件對應(yīng)的服務(wù)

啟用預(yù)設(shè)的配置文件:

  • 第一步 確保在默認(rèn)站點配置文件(default文件)的server項內(nèi)包含以下命令:
include /config/nginx/proxy-confs/*.subfolder.conf;
include /config/nginx/proxy-confs/*.subdomain.conf;
  • 第二步 重命名 conf 文件并刪除結(jié)尾的 .sample?
  • 第三步 重啟 letsencrypt 容器

3.3 證書相關(guān)

3.3.1 證書種類
  • cert.pem、chain.pem、fullchain.pem 和 privkey.pem。通過 letsencrypt 生成并由 Nginx 和其它各種應(yīng)用使用
  • privkey.pfx:Microsoft支持的格式,常用于 Embnet Server 等 dotnet 應(yīng)用程序(無密碼)
  • priv-fullchain-bundle.pem:一個捆綁私鑰和全鏈的 pem 證書,由 ZNC 等應(yīng)用程序使用
3.3.2 在其他容器中使用證書

證書在容器中的存放在 config/etc/letsencrypt 文件夾下,又因為 /config 文件夾被映射到宿主機,故如果需要在其他容器中使用,可以再把宿主機對應(yīng)目錄下的 etc/letsencrypt 文件夾映射到需要用到證書的容器。

3.3.3 在SpringBoot 下使用

1. 將 pem 證書轉(zhuǎn)為 JKS 格式,在此過程需要輸入密碼。這里使用的是網(wǎng)上的 SSL證書格式轉(zhuǎn)換工具(https://www.chinassl.net/ssltools/convert-ssl.html)

2. 在SpringBoot 里面配置。有了JKS證書和密碼后配置就很簡單了,這里不貼出來。

3.3.4 fail2ban

fail2ban 是一款實用軟件,可以監(jiān)視你的系統(tǒng)日志,然后匹配日志的錯誤信息(正則式匹配)執(zhí)行相應(yīng)的屏蔽動作。多用于防止暴力破解和 CC 攻擊。

1. 文件結(jié)構(gòu)

/config/fail2ban 目錄下主要有一個 jail.local 文件和 filter.d、action.d 兩個文件夾。另外,還有一個 fail2ban.sqlite3 的數(shù)據(jù)庫文件,這個不用管

  • jail.local 文件:負(fù)責(zé) fail2ban 的主要配置,統(tǒng)管所有 jail 的啟用和禁用和監(jiān)控規(guī)、日志路徑等
  • filter.d 文件夾:存放各個 jail 的過濾器配置文件,如 nginx-http-auth.conf 文件等
  • action.d 文件夾:存放各種功能對應(yīng)的配置文件,如 sendmail.conf 文件等
2. 使用說明
  • 該容器內(nèi)置的fail2ban默認(rèn)包括(并開啟)3個jail
  1. nginx-http-auth
  2. nginx-badbots
  3. nginx-botsearch
  • 可以通過修改文件 /config/fail2ban/jail.local 去啟用或禁用其他 jail
  • 要修改 filter.d 文件夾或 action.d 文件夾下的配置文件時,不要直接編輯 .conf 文件而應(yīng)該創(chuàng)建一個同名的但以 .local 結(jié)尾的文件(如想要修改 nginx-http-auth.conf 的話就創(chuàng)建一個 nginx-http-auth.local)。這是因為當(dāng) actions 和 fileter 更新時,.conf 文件會被覆寫而使修改失效。而 .local文件是追加到 .conf文件后面的,不受.conf文件的變動的影響(根據(jù)對 Dockerfile 文件的分析,這些 .conf 文件應(yīng)該是在構(gòu)建 Docker 鏡像時下載的,所以更新鏡像后即使復(fù)用原來的文件夾,.conf?文件也會被覆寫)
  • 查看哪些 jail 是啟用的
docker exec -it letsencrypt fail2ban-client status
  • 查看特定 jail 的狀態(tài)
docker exec -it letsencrypt fail2ban-client status <jail name>
  • 設(shè)置特定 jail 對特定 IP 放行(注意:linuxserver/letsencrypt 給的教程沒有 set ,會報指令錯誤。根據(jù)下面 fail2ban 的官方命令,我發(fā)現(xiàn)要加set)
docker exec -it letsencrypt fail2ban-client set <jail name> unbanip <IP>
  • 命令列表:https://www.fail2ban.org/wiki/index.php/Commands
3. 默認(rèn)配置

查看 /config/fail2ban/jail.local 文件,部分內(nèi)容如下:

[DEFAULT]
# "bantime" is the number of seconds that a host is banned.
bantime  = 600
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = 600
# "maxretry" is the number of failures before a host get banned.
maxretry = 5

[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /config/log/nginx/error.log

上方 [DEFAULT]?的含義:若在600秒內(nèi)失敗5次,則禁止訪問600秒。
[nginx-http-auth] 的內(nèi)容是啟用,使用 nginx-http-auth 過濾器監(jiān)聽 HTTP 和 HTTPS 端口并把日志寫在 /config/log/nginx/error.log 文件里。配置的選項則同[DEFAULT]。更多配置信息請看官方指南:http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#General_settings

4. 測試

接下來當(dāng)然是來測試一波啦。

先確保網(wǎng)頁 HTTP 密碼保護打開,然后登陸。任意錯誤登陸(用戶名不能為空)5次后網(wǎng)頁就開始提示找不到服務(wù)器了。

這個時候可以查看一下 jail 的狀態(tài),內(nèi)容如下:

Total banned 表示歷史 ban 總記錄。在 Banned IP list 中可以看到 IP 已經(jīng)被封了。

接下來再把 IP 解禁,如下:

可以查看 /config/log/fail2ban/fail2ban.log 文件:

這個是600秒后自動解禁的
2018-09-15 09:39:44,090 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 09:39:44
2018-09-15 09:39:48,295 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 09:39:48
2018-09-15 09:39:53,503 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 09:39:53
2018-09-15 09:39:56,709 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 09:39:56
2018-09-15 09:39:57,911 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 09:39:57
2018-09-15 09:39:58,107 fail2ban.actions        [343]: NOTICE  [nginx-http-auth] Ban 125.90.49.157
2018-09-15 09:49:58,920 fail2ban.actions        [343]: NOTICE  [nginx-http-auth] Unban 125.90.49.157

這個是使用命令解禁的
2018-09-15 11:18:10,728 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 11:18:10
2018-09-15 11:18:12,738 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 11:18:12
2018-09-15 11:18:13,940 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 11:18:13
2018-09-15 11:18:14,542 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 11:18:14
2018-09-15 11:18:15,143 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 11:18:14
2018-09-15 11:18:15,620 fail2ban.actions        [343]: NOTICE  [nginx-http-auth] Ban 125.90.49.157
2018-09-15 11:18:15,745 fail2ban.filter         [343]: INFO    [nginx-http-auth] Found 125.90.49.157 - 2018-09-15 11:18:15
2018-09-15 11:18:35,942 fail2ban.actions        [343]: NOTICE  [nginx-http-auth] Unban 125.90.49.157

參考文檔

  • GitHub:https://github.com/linuxserver/docker-letsencrypt
  • DockerHub:https://hub.docker.com/r/linuxserver/letsencrypt/
  • fail2ban配置:http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#General_settings

標(biāo)簽: dns dns 服務(wù)器 dns服務(wù) Google linux ssl ssl證書 安全 電子郵件 頂級域名 服務(wù)器 服務(wù)商 漏洞 權(quán)限 數(shù)據(jù)庫 搜索 搜索引擎 

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:ImportNew一周資訊:2019軟件趨勢

下一篇:Java HashMap源碼分析