想把賬戶統一管理起來,jenkins,gitlab,jumpserver甚至kibana,kubernetes等等。本來搭建過openldap。昨天小伙伴強烈推薦我用一下freeipa......又進入了盲區,沒有聽過的東西都比較好奇,淺淺的體驗一下!freeipa服務就不想部署在kubernetes中了 也準備docker方式啟動部署。畢竟這樣方便升級還原。kubernetes中部署了還要額外映射端口啥的麻煩......偷懶一下!
(資料圖)
注: 操作系統rockylinux9.0,以docker-compose方式啟動freeipa!。主機內網ip 10.0.4.52.
添加docker-ce國內源,這里使用了阿**的源,安裝docker-ce:
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repodnf -y install docker-ce docker-ce-cli containerd.io
訪問github倉庫:https://github.com/docker/compose/releases/,選擇對應版本針對系統的版本進行下載(會很慢,可以科學上網,或者跟我一樣,提前下載了放在對象存儲上面!)
curl "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-composedocker-compose --version
可以跟據自己的阿里亞賬戶的容器鏡像服務-鏡像攻擊-鏡像加速器,配置鏡像加速:
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-"EOF"{ "registry-mirrors": ["https://7zk8hbh7.mirror.aliyuncs.com"], "features": { "buildkit": true }, "experimental": true, "cgroup-parent": "docker.slice", "exec-opts": ["native.cgroupdriver=systemd"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
注:registry-mirrors下面的忘了那里復制來的了 就直接帶著了!
docker infodocker -v
偷懶了docker-compose.yaml存放在了/data/freeipa目錄。freeipa數據目錄/data/free-ipa/data /data/free-ipa/data/logs:
mkdir -p /data/free-ipa/data mkdir -p /data/free-ipa/logs
docker-compose.yaml如下(小伙伴的文件直接拿來用的):
version: "3.3"services: freeipa: image: freeipa/freeipa-server:almalinux-8-4.9.8 container_name: xxxx.xxxx.com domainname: xxxx.xxxx.com container_name: freeipa_idc ports: - "80:80/tcp" - "443:443/tcp" # DNS - "53:53/tcp" - "53:53/udp" # LDAP(S) - "389:389/tcp" - "636:636/tcp" # Kerberos - "88:88/tcp" - "88:88/udp" - "464:464/tcp" - "464:464/udp" # NTP - "123:123/udp" dns: - 127.0.0.1 - 183.60.82.98 - 183.60.83.19 - 114.114.114.114 tty: true stdin_open: true environment: IPA_SERVER_HOSTNAME: xxxx.xxxx.com IPA_SERVER_IP: 10.0.4.52 TZ: "Asia/Shanghai" command: - --domain=xxxx.com - --realm=xxx.com - --admin-password=xxxx #freeapi的admin管理員賬號 - --http-pin=xxxx - --dirsrv-pin=xxxx - --ds-password=xxxx - --no-dnssec-validation - --no-host-dns - --setup-dns - --auto-forwarders - --allow-zone-overlap - --unattended # 自動無人工干預安裝 cap_add: - SYS_TIME - NET_ADMIN restart: unless-stopped volumes: - /etc/localtime:/etc/localtime:ro - /sys/fs/cgroup:/sys/fs/cgroup:ro - /data/free-ipa/data:/data - /data/free-ipa/logs:/var/logs sysctls: - net.ipv6.conf.all.disable_ipv6=0 - net.ipv6.conf.lo.disable_ipv6=0 security_opt: - "seccomp:unconfined" labels: - idc-freeipa extra_hosts: - "xxxx.xxxx.com:10.0.4.52 "
就默認修改了一下 域名 ip dns 密碼 domain realm 等xxx部分!
docker-compose up -d docker logs -f freeipa_idc
網上看了很多文章基本是cgroup的問題:https://serverfault.com/questions/1053187/systemd-fails-to-run-in-a-docker-container-when-using-cgroupv2-cgroupns-priva.https://github.com/freeipa/freeipa-container/issues/520
服務器查看了一眼確實系統默認cgroup v2版本:
mount |grep cgroup
修改systemd.unified_cgroup_hierarchy=0 并重啟服務器:
grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"reboot
查看cgroup可以支持V1了 繼續啟動服務
mount |grep cgroup
docker-compose down docker-compose up -d
等待服務啟動........
第一次訪問很坑爹:右上角會彈出一個登陸框讓輸入用戶名密碼,連著輸入都是錯誤的,都懷疑人生準備重新部署了,看到一篇文章說要點兩次取消就可以出現下面的頁面登陸框:搭建freeIPA服務器實現用戶管理
不出意外輸入可能會顯示密碼錯誤.....日志也不打出新的...怎么破?
docker-compose.yaml中admin-password 變量盡量別加特殊符號貌似(登陸了后臺可以控制臺修改密碼!)
登陸控制臺基本是如下頁面:
用戶 用戶組個人關注的就這兩個關鍵詞。繼續強迫癥修改https證書:
參照:https://computingforgeeks.com/secure-freeipa-server-with-lets-encrypt-ssl-certificate/文中是宿主機安裝的方式,當然了docker中也是適用!
進入freeipa容器
docker exec -it freeipa_idc bash
進入容器后,通過管理員用戶身份獲取 Kerberos 票據來確認它正在運行:
sudo kinit adminsudo klist
安裝epel repo與certbot:
sudo yum install epel-releasesudo yum install certbot python3-certbot-apachecertbot --version
首先備份當前的 FreeIPA 服務器私鑰和證書,安裝 git、vim 或 nano 文件編輯器(可選主要是git vim )
sudo cp -r /var/lib/ipa/certs{,.bak}sudo cp -r /var/lib/ipa/private{,.bak}sudo yum -y install vim nano git
使用手動方法使用 Let"s Encrypt 保護 FreeIPA 服務器:
創建證書目錄:
sudo su -mkdir freeipa-certscd freeipa-certs
下載 Let"s Encrypt CA 證書:
CERTS=("isrgrootx1.pem" "isrg-root-x2.pem" "lets-encrypt-r3.pem" "lets-encrypt-e1.pem" "lets-encrypt-r4.pem" "lets-encrypt-e2.pem")for CERT in "${CERTS[@]}"do curl -o $CERT "https://letsencrypt.org/certs/$CERT"done
將 Let"s Encrypt CA 證書安裝到 FreeIPA 證書存儲中:
CERTS=("isrgrootx1.pem" "isrg-root-x2.pem" "lets-encrypt-r3.pem" "lets-encrypt-e1.pem" "lets-encrypt-r4.pem" "lets-encrypt-e2.pem")for CERT in "${CERTS[@]}"do ipa-cacert-manage install $CERTdone
預期會出現一下輸出:
使用來自服務器的證書更新本地 IPA 證書數據庫:
sudo ipa-certupdate
獲取 Let"s Encrypt 證書
停止 httpd 服務以釋放獲取證書所需的端口 80:
sudo systemctl stop httpd
然后運行 Certbot 獲取 Let"s Encrypt 證書:
EMAIL="[email protected]"DOMAIN="xxx.xxxx.com"sudo certbot certonly --standalone --preferred-challenges http --agree-tos -n -d $DOMAIN -m $EMAIL
您的證書應存儲在 /etc/letsencrypt/live/xxx.xxx.com 目錄中
[root@86ca990dc234 freeipa-certs]# ls /etc/letsencrypt/live/xxx.xxxx.com/READMEcert.pem chain.pem fullchain.pem privkey.pem
確認生成所需的證書后啟動 httpd 服務器:
sudo systemctl restart httpd
添加 Let"s Encrypt SSL 證書以在 FreeIPA Web UI 中使用:
DOMAIN="xxx.xxx.com" # Set correct IdM hostnamesudo ipa-server-certinstall -w -d /etc/letsencrypt/live/$DOMAIN/privkey.pem /etc/letsencrypt/live/$DOMAIN/cert.pem --pin=""
重啟 FreeIPA 服務:
[root@86ca990dc234 freeipa-certs]# sudo ipactl restartRestarting Directory ServiceRestarting krb5kdc ServiceRestarting kadmin ServiceRestarting named ServiceRestarting httpd ServiceRestarting ipa-custodia ServiceRestarting pki-tomcatd ServiceRestarting ipa-otpd ServiceRestarting ipa-dnskeysyncd Serviceipa: INFO: The ipactl command was successfu
可以從終端或網絡瀏覽器確認當前使用的 SSL 證書。 使用 OpenSSL:
openssl s_client -showcerts -verify 5 -connect $(hostname -f):443
瀏覽器訪問:
github 克隆官方 FreeIPA Let"s Encrypt 管理腳本代碼:
git clone https://github.com/freeipa/freeipa-letsencrypt.git
切換到freeipa-letsencrypt目錄,編輯 renew-le.sh 腳本并設置 EMAIL 變量::
cd freeipa-letsencrypt$ vim renew-le.shEMAIL="[email protected]"
在 setup-le.sh 腳本中,FreeIPA 服務器 FQDN 設置為服務器的主機名(確保hostname -f命令將主機名作為 FQDN 返回:):
FQDN=$(hostname -f)hostname -f
運行 setup-le.sh 腳本:
sudo bash setup-le.sh
該腳本將執行以下操作:
將 Let"s Encrypt CA 證書安裝到 FreeIPA 證書存儲中為 FreeIPA Web 界面申請新證書會出現一下提示讓輸入pass:
Enter pass phrase for /var/lib/ipa/private/httpd.key:
嘗試了好多次沒有找到這個pass,最后參照:https://github.com/freeipa/freeipa-letsencrypt/issues/18。找到此pass:
cat /var/lib/ipa/passwds/xxx.xxxx.com-443-RSA
重啟httpd服務,確認 ipa-certupdate 命令執行成功:
sudo systemctl restart httpdsudo ipa-certupdate
如果只對在瀏覽器頁面上使用 Let"s Encrypt SSL 感興趣,您可以手動修改 ssl.conf 文件并設置以下指令(但是文章中說不推薦?):
$ sudo vim /etc/httpd/conf.d/ssl.confSSLCertificateFile /etc/letsencrypt/live/xxxx.xxxx.com/fullchain.pemSSLCertificateKeyFile /etc/letsencrypt/live/xxxx.xxxx.com/privkey.pem
重啟httpd服務:
systemctl restart httpd
每當續訂 SSL 證書時,運行以下命令以在 FreeIPA 端更新:
DOMAIN="xxxx.xxxx.com" # Set correct IdM hostnamesudo ipa-server-certinstall -w -d /etc/letsencrypt/live/$DOMAIN/privkey.pem /etc/letsencrypt/live/$DOMAIN/cert.pem --pin=""
根據需要輸入目錄管理員密碼:
然后在安裝證書后繼續重啟 FreeIPA 服務:
sudo ipactl restart
騰訊云下載了nginx證書:
修改/etc/httpd/conf.d/ssl.conf對應位置:
SSLCertificateFile 對應上圖pem文件,SSLCertificateKeyFile對應上面key文件(可以直接修改后綴!)
重啟apache服務:
systemctl restart httpd
成功修改成自己的泛域名證書:
關于證書還是自動生成使用 Let"s Encrypt SSL 不要自己上傳自己的證書,會出現無法登陸的問題:
[remote xxx.xxx.xxx.xxxx:3045] ipa: INFO: 401 Unauthorized: HTTPSConnectionPool(host="xxx.xxx.com", port=443): Max retries exceeded with url: /ipa/session/cookie (Caused by SSLError(SSLError(1, "[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:897)"),))
我當時出現了web ui登陸的錯誤:記一次FreeIPA WEBUI 登陸錯誤 Login failed due to an unkno,基本也是這樣的樣子,后面將證書重新使用 Let"s Encrypt SSL 生成后解決問題!