HTMLTAG_67__HTMLTAG_68___1。安全強化清單___HTMLTAG_69__HTMLTAG_70
在Keycloak投入生產之前,需要全面實施以下加強措施:
___HTMLTAG_75__HTMLTAG_76___#___HTMLTAG_77__HTMLTAG_78___類別____HTMLTAG_79__HTMLTAG_80___等級____HTMLTAG_81__HTMLTAG_82___狀態__HTMLTAG_83____HTMLTAG_81__HTMLTAG_82___狀態__HTMLTAG_83__HTMLTAG_844___ ___HTMLTAG_87__HTMLTAG_88___1___HTMLTAG_89__HTMLTAG_90___HTTPS/TLS 強制執行___HTMLTAG_91__HTMLTAG_92____嚴重___HTMLTAG_93__HTMLTAG_94__________________HTMLTAG_93__HTMLTAG_94_______________HTMLTAG_95__HT___ML ___HTMLTAG_97__HTMLTAG_98___2___HTMLTAG_99__HTMLTAG_100___更改預設管理員憑證____HTMLTAG_101__HTMLTAG_102___嚴重___HTMLTAG_103__HTMLTAG_104________________HTMLTAG_105__HT ___HTMLTAG_107__HTMLTAG_108___3___HTMLTAG_109__HTMLTAG_110___暴力偵測___HTMLTAG_111__HTMLTAG_112___高___HTMLTAG_113__HTMLTAG_114________________HTMLTAGMLTAGMLHT ___HTMLTAG_117__HTMLTAG_118___4___HTMLTAG_119__HTMLTAG_120___密碼策略___HTMLTAG_121__HTMLTAG_122___高___HTMLTAG_123__HTMLTAG_124___________HTMLTAG_125__HTML ___HTMLTAG_127__HTMLTAG_128___5___HTMLTAG_129__HTMLTAG_130___會話逾時___HTMLTAG_131__HTMLTAG_132___高___HTMLTAG_133__HTMLTAG_134________________HTMLTAG_135__HTML ___HTMLTAG_137__HTMLTAG_138___6___HTMLTAG_139__HTMLTAG_140___CSP 標頭___HTMLTAG_141__HTMLTAG_142___高___HTMLTAG_143__HTMLTAG_144441TAG_143__146 ___HTMLTAG_147__HTMLTAG_148___7___HTMLTAG_149__HTMLTAG_150___點擊劫持保護___HTMLTAG_151__HTMLTAG_152___高___HTMLTAG_153__HTMLTAG_154________________HTMLTAG_151HTMLTAG_153__HTMLTAG_154________________HTMLTAG_155__HT ___HTMLTAG_157__HTMLTAG_158____8___HTMLTAG_159__HTMLTAG_160___CORS 設定___HTMLTAG_161__HTMLTAG_162___中___HTMLTAG_163__HTMLTAG_1644HTMLTAG_163__HTMLTAG_16441TAG163__161_164 ___HTMLTAG_167__HTMLTAG_168____9___HTMLTAG_169__HTMLTAG_170___機密保管庫整合___HTMLTAG_171__HTMLTAG_172___高___HTMLTAG_173__HTMLTAG_174HTMLTAG_173__HTMLTAG_174 ___HTMLTAG_177__HTMLTAG_178___10____HTMLTAG_179__HTMLTAG_180___管理控制台存取限制___HTMLTAG_181__HTMLTAG_182___高___HTMLTAG_183__HTMLTAG_184___________________TAG_184___ML ___HTMLTAG_187__HTMLTAG_188___11___HTMLTAG_189__HTMLTAG_190___停用未使用的功能/端點___HTMLTAG_191__HTMLTAG_192___中___HTMLTAG_193__HTMLTAG_194_HTMLTAGMLTAGMLTAGMLTAG19____ ___HTMLTAG_197__HTMLTAG_198___12___HTMLTAG_199__HTMLTAG_200___靜態資料庫加密___HTMLTAG_201__HTMLTAG_202___高___HTMLTAG_203__HTMLTAG_204________________HTMLTAG_2051202050_____ ___HTMLTAG_207__HTMLTAG_208___13___HTMLTAG_209__HTMLTAG_210___令牌安全性(短暫)___HTMLTAG_211__HTMLTAG_212___高___HTMLTAG_213__HTMLTAG_2142_HTMLTAGMLTAGMLTAGMLTAG1_21_2116 ___HTMLTAG_217__HTMLTAG_218___14___HTMLTAG_219__HTMLTAG_220___已啟用審核日誌記錄___HTMLTAG_221__HTMLTAG_222___高___HTMLTAG_223__HTMLTAG_224________________TAGHTMLTAG_229__HTMLTAG_230___2。內容安全策略 (CSP) 標頭___HTMLTAG_231__HTMLTAG_232
CSP 標頭透過控制允許在頁面上載入的資源來防止 XSS 攻擊。
HTMLTAG_235__HTMLTAG_236___2.1 在Keycloak中設定CSP___HTMLTAG_237__HTMLTAG_238
Keycloak 透過 領域設定 → 安全防禦:
設定 CSP預編碼_0
HTMLTAG_243__HTMLTAG_244___2.2 透過 REST API 進行設定___HTMLTAG_245__HTMLTAG_246
預編碼_1
HTMLTAG_247__HTMLTAG_248___2.3 重要安全標頭___HTMLTAG_249__HTMLTAG_250
___HTMLTAG_253__HTMLTAG_254___標頭____HTMLTAG_255__HTMLTAG_256___建議值____HTMLTAG_257__HTMLTAG_258___用途____HTMLTAG_259__HTMLTAG_260___ ___HTMLTAG_263__HTMLTAG_264__HTMLTAG_265___X-Frame-Options___HTMLTAG_266__HTMLTAG_267__HTMLTAG_268__H TMLTAG_269____SAMEORIGIN___HTMLTAG_270__HTMLTAG_271__HTMLTAG_272___反點擊劫持___HTMLTAG_273__HTMLTAG_274___ ___HTMLTAG_275__HTMLTAG_276__HTMLTAG_277___X-內容類型選項___HTMLTAG_278__HTMLTAG_279__HTMLTAG_280__HTMLT AG_281___nosniff___HTMLTAG_282__HTMLTAG_283__HTMLTAG_284___反MIME類型嗅探___HTMLTAG_285__HTMLTAG_286___ ___HTMLTAG_287__HTMLTAG_288__HTMLTAG_289___X-XSS-保護___HTMLTAG_290__HTMLTAG_291__HTMLTAG_292__HTMLTAG_293___1; mode=block___HTMLTAG_292__HTMLTAG_293___1;過濾器___HTMLTAG_297__HTMLTAG_298___ ___HTMLTAG_299__HTMLTAG_300__HTMLTAG_301___嚴格傳輸安全___HTMLTAG_302__HTMLTAG_303__HTMLTAG_304__HTMLTAG_305___max-age=31536000; includeSubDomains___HTMLTAG_306__HTMLTAG_307__HTMLTAG_308___強制 HTTPS (HSTS)___HTMLTAG_309__HTMLTAG_310___ ___HTMLTAG_311__HTMLTAG_312__HTMLTAG_313___引薦來源網址策略___HTMLTAG_314__HTMLTAG_315__HTMLTAG_316__HTMLT AG_317___無引薦來源____HTMLTAG_318__HTMLTAG_319__HTMLTAG_320___不傳送引薦來源網址標頭___HTMLTAG_321__HTMLTAG_322___ ___HTMLTAG_323__HTMLTAG_324__HTMLTAG_325___內容安全策略___HTMLTAG_326__HTMLTAG_327__HTMLTAG_328___限制frame-src、object-src___HTMLTAG_329__HTMLTAG_330130130____UUS_____29__HTMLTAG_330_______HTMLTAG_335__HTMLTAG_336___3。暴力檢測___HTMLTAG_337__HTMLTAG_338
Keycloak 對於登入嘗試有內建的反暴力破解機制。
HTMLTAG_341__HTMLTAG_342___3.1 暴力配置___HTMLTAG_343__HTMLTAG_344
轉到 領域設定 → 安全防禦 → 暴力偵測:
預編碼_2
HTMLTAG_349__HTMLTAG_350___3.2 透過 REST API 進行設定___HTMLTAG_351__HTMLTAG_352
預編碼_3
HTMLTAG_353__HTMLTAG_354___3.3 暴力偵測的工作原理____HTMLTAG_355__HTMLTAG_356
預編碼_4
HTMLTAG_357__HTMLTAG_358___3.4 解鎖 使用者已鎖定___HTMLTAG_359__HTMLTAG_360
預編碼_5
HTMLTAG_361__HTMLTAG_362___4。密碼策略___HTMLTAG_363__HTMLTAG_364
Keycloak 支援多種密碼策略以確保強密碼。
HTMLTAG_367__HTMLTAG_368___4.1 設定密碼原則___HTMLTAG_369__HTMLTAG_370
前往 驗證 → 政策 → 密碼策略 並新增原則:
___HTMLTAG_377__HTMLTAG_378___政策___HTMLTAG_379__HTMLTAG_380___說明____HTMLTAG_381__HTMLTAG_382___範本值____HTMLTAG_383__HTMLTAG_384___ ___HTMLTAG_387__HTMLTAG_388__HTMLTAG_389___長度___HTMLTAG_390__HTMLTAG_391__HTMLTAG_392___最小長度分鐘___HTMLTAG_393__HTMLTAG_394__HTMLTAG_395___12___HTMLTAG_396__HTMLTAG_397__HTMLTAG_398___ ___HTMLTAG_399__HTMLTAG_400__HTMLTAG_401___最大長度___HTMLTAG_402__HTMLTAG_403__HTMLTAG_404___最大長度多___HTMLTAG_405__HTMLTAG_406__HTMLTAG_407___128___HTMLTAG_408__HTMLTAG_409__HTMLTAG_410___ ___HTMLTAG_411__HTMLTAG_412__HTMLTAG_413___位數___HTMLTAG_414__HTMLTAG_415__HTMLTAG_416___最少字元數___HTMLTAG_417__HTMLTAG_418__HTMLTAG___ML_419_1___MLTAGMLTA2014201420142074120142020741202074120207070707070707070707_UMLTAG ___HTMLTAG_423__HTMLTAG_424__HTMLTAG_425___lowerCase___HTMLTAG_426__HTMLTAG_427__HTMLTAG_428___小寫字元數(最少)___HTMLTAG_429__HTMLTAG_430__HTMLTAG_431___1___HTMLTAG_432__HTMLTAG_433__HTMLTAG_434___ ___HTMLTAG_435__HTMLTAG_436__HTMLTAG_437___大寫___HTMLTAG_438__HTMLTAG_439__HTMLTAG_440___大寫字符數(分鐘)___HTMLTAG_441__HTMLTAG_442__HTMLTAG_443___1___HTMLTAG_444__HTMLTAG_445__HTMLTAG_446___ ___HTMLTAG_447__HTMLTAG_448__HTMLTAG_449___特殊字元___HTMLTAG_450__HTMLTAG_451__HTMLTAG_452___特殊字符的最大數量最小值___HTMLTAG_453__HTMLTAG_454__HTMLTAG_455___1___HTMLTAG_456__HTMLTAG_457__HTMLTAG_458___ ___HTMLTAG_459__HTMLTAG_460__HTMLTAG_461___不是使用者名稱___HTMLTAG_462__HTMLTAG_463__HTMLTAG_464___密碼不能與使用者名稱相同___HTMLTAG_465__HTMLTAG_466___(無值) ___HTMLTAG_469__HTMLTAG_470__HTMLTAG_471___不是電子郵件___HTMLTAG_472__HTMLTAG_473__HTMLTAG_474___密碼不能與電子郵件相同___HTMLTAG_475__HTMLTAG_476____ML(無值)___HTMLTA___ML____476____(無值)___ML____ ___HTMLTAG_479__HTMLTAG_480__HTMLTAG_481___密碼歷史記錄___HTMLTAG_482__HTMLTAG_483__HTMLTAG_484___不要重複使用最近的 N密碼___HTMLTAG_485__HTMLTAG_486__HTMLTAG_487___5___HTMLTAG_488__HTMLTAG_489__HTMLTAG_490___ ___HTMLTAG_491__HTMLTAG_492__HTMLTAG_493___雜湊演算法____HTMLTAG_494__HTMLTAG_495__HTMLTAG_496___雜湊演算法密碼_ __HTMLTAG_497__HTMLTAG_498__HTMLTAG_499___pbkdf2-sha512___HTMLTAG_500__HTMLTAG_501__HTMLTAG_502___ ___HTMLTAG_503__HTMLTAG_504__HTMLTAG_505___hashIterations____HTMLTAG_506__HTMLTAG_507__HTMLTAG_508_ __循環雜湊數____HTMLTAG_509__HTMLTAG_510__HTMLTAG_511___210000___HTMLTAG_512__HTMLTAG_513__HTMLTAG_514___ ___HTMLTAG_515__HTMLTAG_516__HTMLTAG_517___forceExpiredPasswordChange___HTMLTAG_518__HTMLTAG_519__HTMLTAG_520___在 N 日期後強制更改MK___HTMLTAG_521__HTMLTAG_522__HTMLTAG_523___90___HTMLTAG_524__HTMLTAG_525__HTMLTAG_526___ ___HTMLTAG_527__HTMLTAG_528__HTMLTAG_529___regulxExpression____HTMLTAG_530__HTMLTAG_531__HTMLTAG_532___正規表示式模式可選編輯___HTMLTAG_533__HTMLTAG_534__HTMLTAG_535___^(?!.*(.)\1{2}).*$___HTMLTAG_536__HTMLTAG_537__HTMLTAG_538___HTMLTAG_541__HTMLTAG_542___4.2 透過 REST API 進行設定___HTMLTAG_543__HTMLTAG_544______預編碼_6
HTMLTAG_545__HTMLTAG_546___4.3 雜湊演算法建議___HTMLTAG_547__HTMLTAG_548
___HTMLTAG_551__HTMLTAG_552___演算法____HTMLTAG_553__HTMLTAG_554___迭代(建議)___HTMLTAG_555__HTMLTAG_556___註解____HTMLTAG_557__HTMLTAG_558___ ___HTMLTAG_561__HTMLTAG_562__HTMLTAG_563___pbkdf2-sha256____HTMLTAG_564__HTMLTAG_565__HTMLTAG_566___MLOWG_567__HT建議___HTMLTAG_569__HTMLTAG_570___ ___HTMLTAG_571__HTMLTAG_572__HTMLTAG_573___pbkdf2-sha512____HTMLTAG_574__HTMLTAG_575__HTMLTAG_576___210,000___HTMLTAG_577__HTMLTAG_576___210,000___HTMLTAG_577__HT推薦___HTMLTAG_579__HTMLTAG_580___ ___HTMLTAG_581__HTMLTAG_582__HTMLTAG_583___argon2___HTMLTAG_584__HTMLTAG_585__HTMLTAG_586___不適用(Keycloak 24+)___HTMLTAG_587__HTMLTAGML_588_____預編碼_7
HTMLTAG_593__HTMLTAG_594___5。會話管理___HTMLTAG_595__HTMLTAG_596
強大的會話管理對於安全性非常重要。
HTMLTAG_599__HTMLTAG_600___5.1 會話逾時___HTMLTAG_601__HTMLTAG_602
在 領域設定 → 會話:
進行配置 ___HTMLTAG_609__HTMLTAG_610___設定___HTMLTAG_611__HTMLTAG_612___說明___HTMLTAG_613__HTMLTAG_614___推薦__HTMLTAG_615__HTMLTAG_616___ ___HTMLTAG_619__HTMLTAG_620__HTMLTAG_621___SSO 會話空閒___HTMLTAG_622__HTMLTAG_623__HTMLTAG_624___SSO 會話的最大空閒時間____HTMLTAG_625__HTMLTAG___1626162625__HT ___HTMLTAG_629__HTMLTAG_630__HTMLTAG_631___SSO 會話最長___HTMLTAG_632__HTMLTAG_633__HTMLTAG_634___SSO 會話最長時間(無論活動如何)___HTMLTAG_635__HTMLTAG_6361013635__ ___HTMLTAG_639__HTMLTAG_640__HTMLTAG_641___SSO 會話空閒「記住我」___HTMLTAG_642__HTMLTAG_643__HTMLTAG_644___啟用「記得我」___HTMLTAG_642__HTMLTAG_643__HTMLTAG_644______啟用「記得我」時空閒____MLTAG_64511TAG_64517G_64511TAG_64511TAG_64517G日期___HTMLTAG_647__HTMLTAG_648___ ___HTMLTAG_649__HTMLTAG_650__HTMLTAG_651___SSO 會話最長記住我___HTMLTAG_652__HTMLTAG_653__HTMLTAG_654___啟用「記住我」時的最長生命週期___HTMLTAG_655__5MLG____啟用「記住我」時的最長生命週期___HTMLTAG_655__5日期___HTMLTAG_657__HTMLTAG_658___ ___HTMLTAG_659__HTMLTAG_660__HTMLTAG_661___客戶端會話空閒___HTMLTAG_662__HTMLTAG_663__HTMLTAG_664____客戶端特定會話的空閒逾時___HTMLTAG_665_HTMLTAG___ML_客戶端特定會話的空閒逾時___HTMLTAG_665_HTMLTAG___ML____ML] ___HTMLTAG_669__HTMLTAG_670__HTMLTAG_671____客戶端會話最長___HTMLTAG_672__HTMLTAG_673__HTMLTAG_674____客戶端特定會話的最長生命週期___HTMLTAG_675__HTMLTAG___ML_客戶端特定會話的最長生命週期___HTMLTAG_675__HTMLTAG___ML_7618676______HT ___HTMLTAG_679__HTMLTAG_680__HTMLTAG_681____離線會話空閒____HTMLTAG_682__HTMLTAG_683__HTMLTAG_684____離線令牌的空閒逾時____HTMLTAG_685__HTMLTAG_186868685_____ ___HTMLTAG_689__HTMLTAG_690__HTMLTAG_691___離線會話最長___HTMLTAG_692__HTMLTAG_693__HTMLTAG_694___離線會話的最大有限生命週期___HTMLTAG_695__HTMLTAG_696_____HTMLTAG_701__HTMLTAG_702___5.2 詳細會話設定___HTMLTAG_703__HTMLTAG_704
預編碼_8
HTMLTAG_705__HTMLTAG_706___5.3 會話限制___HTMLTAG_707__HTMLTAG_708
限制每個使用者的同時會話數:
預編碼_9
HTMLTAG_711__HTMLTAG_712___5.4 檢查並撤銷會話___HTMLTAG_713__HTMLTAG_714
預編碼_10
HTMLTAG_715__HTMLTAG_716___6。 CORS 設定___HTMLTAG_717__HTMLTAG_718
CORS(跨來源資源共享)在 Keycloak 中為每個客戶端配置.
HTMLTAG_723__HTMLTAG_724___6.1 為客戶端設定 CORS___HTMLTAG_725__HTMLTAG_726
# Client Settings → Web Origins
# Cho phép specific origins
https://myapp.com
https://admin.myapp.com
# Cho phép tất cả redirect URIs (sử dụng "+")
+
# KHÔNG sử dụng "*" trong production
# "*" cho phép tất cả origins — nguy hiểm!
# Cấu hình CORS qua REST API
curl -X PUT "http://localhost:8080/admin/realms/my-realm/clients/$CLIENT_UUID" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"webOrigins": [
"https://myapp.com",
"https://admin.myapp.com"
]
}'
HTMLTAG_727__HTMLTAG_728___6.2 CORS 最佳實務___HTMLTAG_729__HTMLTAG_730
-
__HTMLTAG_732__HTMLTAG_733___總是指定特定來源 — 請勿使用萬用字元
*HTMLTAG_736__HTMLTAG_737
___HTMLTAG_738__HTMLTAG_739___使用 +HTMLTAG_741__HTMLTAG_742 — 自動從有效重定向 URI 衍生來源
___HTMLTAG_744__HTMLTAG_745___客戶端分離 — 每個前端應用程式都應該有自己的客戶端和自己的 CORS 設定
___HTMLTAG_748__HTMLTAG_749___徹底測試 — 使用瀏覽器開發工具測試 CORS 回應標頭
HTMLTAG_753__HTMLTAG_754___7。點選劫持保護___HTMLTAG_755__HTMLTAG_756
點擊劫持攻擊將 Keycloak 登入頁面嵌入到 iframe 中以竊取憑證。
HTMLTAG_759__HTMLTAG_760___7.1 設定 X 框架選項___HTMLTAG_761__HTMLTAG_762
# Realm Settings → Security Defenses → Headers
X-Frame-Options: SAMEORIGIN
# - DENY: Không cho phép iframe dưới bất kỳ điều kiện nào
# - SAMEORIGIN: Chỉ cho phép iframe từ cùng origin
# - ALLOW-FROM uri: (deprecated, dùng CSP frame-ancestors thay thế)
___HTMLTAG_763__HTMLTAG_764___7.2 CSP 框架祖先(首選)HTMLTAG_765__HTMLTAG_766
# Content-Security-Policy header
frame-ancestors 'self';
# Cho phép specific parent origins
frame-ancestors 'self' https://portal.mycompany.com;
HTMLTAG_767__HTMLTAG_768___8。 HTTPS/TLS 強制執行___HTMLTAG_769__HTMLTAG_770
HTMLTAG_771__HTMLTAG_772___8.1 主機名稱與 TLS 設定___HTMLTAG_773__HTMLTAG_774
# Production: Strict HTTPS
bin/kc.sh start \
--hostname=auth.mycompany.com \
--hostname-strict=true \
--https-certificate-file=/etc/certs/tls.crt \
--https-certificate-key-file=/etc/certs/tls.key \
--https-port=8443 \
--http-enabled=false
___HTMLTAG_775__HTMLTAG_776___8.2 具有反向代理的 TLS(流行)HTMLTAG_777__HTMLTAG_778
# Khi sử dụng reverse proxy (Nginx, HAProxy) terminate TLS
bin/kc.sh start \
--hostname=auth.mycompany.com \
--hostname-strict=true \
--proxy-headers=xforwarded \
--http-enabled=true \
--http-port=8080
# Nginx reverse proxy configuration
server {
listen 443 ssl http2;
server_name auth.mycompany.com;
ssl_certificate /etc/ssl/certs/auth.mycompany.com.crt;
ssl_certificate_key /etc/ssl/private/auth.mycompany.com.key;
# Strong TLS configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://keycloak:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Timeouts
proxy_read_timeout 90s;
proxy_send_timeout 90s;
}
}
# Redirect HTTP to HTTPS
server {
listen 80;
server_name auth.mycompany.com;
return 301 https://$host$request_uri;
}
___HTMLTAG_779__HTMLTAG_780___8.3 相互 TLS (mTLS)HTMLTAG_781__HTMLTAG_782
# Bật mTLS cho client authentication
bin/kc.sh start \
--https-certificate-file=/etc/certs/tls.crt \
--https-certificate-key-file=/etc/certs/tls.key \
--https-trust-store-file=/etc/certs/truststore.jks \
--https-trust-store-password=changeit \
--https-client-auth=request
# --https-client-auth options:
# none: không yêu cầu client cert
# request: yêu cầu nhưng không bắt buộc
# required: bắt buộc client cert
HTMLTAG_783__HTMLTAG_784___8.4 憑證管理___HTMLTAG_785__HTMLTAG_786
# Sử dụng cert-manager trong Kubernetes
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: keycloak-tls
namespace: keycloak
spec:
secretName: keycloak-tls-secret
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- auth.mycompany.com
renewBefore: 720h # Renew 30 ngày trước khi hết hạn
預編碼_20
HTMLTAG_787__HTMLTAG_788___9。保險櫃整合___HTMLTAG_789__HTMLTAG_790
Keycloak 支援在外部保管庫中儲存機密(LDAP 綁定密碼、SMTP 密碼、用戶端機密),而不是在資料庫中儲存明文。
HTMLTAG_793__HTMLTAG_794___9.1 HashiCorp Vault 整合___HTMLTAG_795__HTMLTAG_796
# Cấu hình Keycloak sử dụng HashiCorp Vault
bin/kc.sh start \
--vault=hashicorp \
--vault-hashicorp-paths=/secret/data/keycloak \
--vault-hashicorp-address=https://vault.mycompany.com:8200 \
--vault-hashicorp-auth-method=token \
--vault-hashicorp-token=$VAULT_TOKEN
# Hoặc sử dụng AppRole authentication
bin/kc.sh start \
--vault=hashicorp \
--vault-hashicorp-paths=/secret/data/keycloak \
--vault-hashicorp-address=https://vault.mycompany.com:8200 \
--vault-hashicorp-auth-method=approle \
--vault-hashicorp-approle-role-id=$ROLE_ID \
--vault-hashicorp-approle-secret-id=$SECRET_ID
HTMLTAG_797__HTMLTAG_798___9.2 在 HashiCorp Vault 中保存機密___HTMLTAG_799__HTMLTAG_800
# Cấu hình Vault KV secrets engine
vault secrets enable -path=secret kv-v2
# Lưu LDAP bind password
vault kv put secret/keycloak/my-realm \
ldap_bind_credential="LdapS3cur3P@ss!" \
smtp_password="SmtpP@ssw0rd!" \
my-client-secret="Cl13ntS3cr3t!"
# Cấu trúc path trong Vault:
# secret/data/keycloak/{realm-name}/{key}
HTMLTAG_801__HTMLTAG_802___9.3 在 Keycloak 中使用 Vault 引用___HTMLTAG_803__HTMLTAG_804
在 Keycloak 中,使用語法 ${vault.key} 而非純文字:
# LDAP User Federation
Bind Credential: ${vault.ldap_bind_credential}
# SMTP Settings
Password: ${vault.smtp_password}
# Client Secret
Client Secret: ${vault.my-client-secret}
HTMLTAG_809__HTMLTAG_810___9.4 Kubernetes/OpenShift Secrets Vault___HTMLTAG_811__HTMLTAG_812
預編碼_24
預編碼_25
# Mount Secret vào Keycloak Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: keycloak
spec:
template:
spec:
containers:
- name: keycloak
args:
- start
- --vault=file
- --vault-dir=/mnt/secrets
volumeMounts:
- name: vault-secrets
mountPath: /mnt/secrets
readOnly: true
volumes:
- name: vault-secrets
secret:
secretName: keycloak-vault
___HTMLTAG_813__HTMLTAG_814___9.5 基於文件的保管庫(開發)HTMLTAG_815__HTMLTAG_816
預編碼_27
HTMLTAG_817__HTMLTAG_818___9.6 輪替憑證___HTMLTAG_819__HTMLTAG_820
預編碼_28
HTMLTAG_821__HTMLTAG_822___10。管理控制台存取限制___HTMLTAG_823__HTMLTAG_824
HTMLTAG_825__HTMLTAG_826___10.1 專用管理領域___HTMLTAG_827__HTMLTAG_828
使用 主領域 僅用於管理員,不建立使用者/客戶業務:
預編碼_29
HTMLTAG_833__HTMLTAG_834___10.2 管理控制台的 IP 白名單___HTMLTAG_835__HTMLTAG_836
# Nginx: Restrict Admin Console access
location /admin/ {
# Chỉ cho phép IP nội bộ
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
deny all;
proxy_pass http://keycloak:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Block admin REST API từ external
location /admin/realms/ {
allow 10.0.0.0/8;
deny all;
proxy_pass http://keycloak:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
HTMLTAG_837__HTMLTAG_838___10.3 Kubernetes 網路策略___HTMLTAG_839__HTMLTAG_840
# NetworkPolicy: Restrict Admin API access
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: keycloak-admin-restrict
namespace: keycloak
spec:
podSelector:
matchLabels:
app: keycloak
policyTypes:
- Ingress
ingress:
# Allow user-facing traffic from ingress controller
- from:
- namespaceSelector:
matchLabels:
name: ingress-nginx
ports:
- port: 8080
# Allow admin traffic only from management namespace
- from:
- namespaceSelector:
matchLabels:
name: management
ports:
- port: 8080
___HTMLTAG_841__HTMLTAG_842___11。令牌安全性___HTMLTAG_843__HTMLTAG_844___
HTMLTAG_845__HTMLTAG_846___11.1 短期代幣___HTMLTAG_847__HTMLTAG_848
# Cấu hình token lifespans
curl -X PUT "http://localhost:8080/admin/realms/my-realm" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"accessTokenLifespan": 300,
"accessTokenLifespanForImplicitFlow": 900,
"actionTokenGeneratedByUserLifespan": 300,
"actionTokenGeneratedByAdminLifespan": 43200
}'
# Per-client token lifespan override
curl -X PUT "http://localhost:8080/admin/realms/my-realm/clients/$CLIENT_UUID" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"attributes": {
"access.token.lifespan": "180",
"client.session.idle.timeout": "600",
"client.session.max.lifespan": "3600"
}
}'
HTMLTAG_849__HTMLTAG_850___11.2 令牌自省___HTMLTAG_851__HTMLTAG_852
# Introspect token (kiểm tra validity)
curl -X POST "http://localhost:8080/realms/my-realm/protocol/openid-connect/token/introspect" \
-d "client_id=my-resource-server" \
-d "client_secret=$CLIENT_SECRET" \
-d "token=$ACCESS_TOKEN"
# Response
# {
# "active": true,
# "sub": "user-uuid",
# "aud": "my-app",
# "exp": 1710492645,
# "iat": 1710489045,
# "realm_access": { "roles": ["user"] },
# "scope": "openid profile email"
# }
HTMLTAG_853__HTMLTAG_854___11.3 令牌撤銷___HTMLTAG_855__HTMLTAG_856
# Revoke refresh token
curl -X POST "http://localhost:8080/realms/my-realm/protocol/openid-connect/revoke" \
-d "client_id=my-app" \
-d "client_secret=$CLIENT_SECRET" \
-d "token=$REFRESH_TOKEN" \
-d "token_type_hint=refresh_token"
# Revoke access token
curl -X POST "http://localhost:8080/realms/my-realm/protocol/openid-connect/revoke" \
-d "client_id=my-app" \
-d "client_secret=$CLIENT_SECRET" \
-d "token=$ACCESS_TOKEN" \
-d "token_type_hint=access_token"
HTMLTAG_857__HTMLTAG_858___12。生產部署 — 強化___HTMLTAG_859__HTMLTAG_860
# docker-compose.production.yml - Hardened Keycloak
services:
keycloak:
image: quay.io/keycloak/keycloak:26.1
command:
- start
- --hostname=auth.mycompany.com
- --hostname-strict=true
- --proxy-headers=xforwarded
- --http-enabled=true
- --metrics-enabled=true
- --health-enabled=true
- --vault=file
- --vault-dir=/mnt/secrets
- --log=console
- --log-console-output=json
environment:
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD_FILE: /run/secrets/db_password
KC_CACHE: ispn
KC_CACHE_STACK: kubernetes
volumes:
- ./secrets:/mnt/secrets:ro
secrets:
- db_password
deploy:
replicas: 2
resources:
limits:
memory: 1G
cpus: '1.0'
reservations:
memory: 512M
cpus: '0.5'
healthcheck:
test: ["CMD-SHELL", "exec 3<>/dev/tcp/localhost/9000 && echo -e 'GET /health/ready HTTP/1.1\r\nHost: localhost\r\n\r\n' >&3 && cat <&3 | grep -q '\"status\":\"UP\"'"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
secrets:
db_password:
file: ./secrets/db_password
HTMLTAG_861__HTMLTAG_862___13。最佳實務摘要___HTMLTAG_863__HTMLTAG_864
___HTMLTAG_866__HTMLTAG_867___HTTPS 無所不在 — 切勿在沒有 TLS 的情況下部署 Keycloak 生產。使用 HSTS 標頭。
___HTMLTAG_870__HTMLTAG_871___保管庫中的秘密 — 請勿在資料庫中儲存明文憑。使用 HashiCorp Vault 或 Kubernetes Secrets.
___HTMLTAG_874__HTMLTAG_875___強密碼策略 — 至少 12 個字符,使用具有高迭代次數的 Argon2 或 PBKDF2-SHA512。
___HTMLTAG_878__HTMLTAG_879___會話限制__HTMLTAG_880___ — 限制並發會話數。設定適當的空閒/最大超時。
___HTMLTAG_882__HTMLTAG_883___管理員存取受限 — 管理控制台的 IP 白名單。管理員帳戶需要 MFA。
___HTMLTAG_886__HTMLTAG_887___短期令牌 — 存取權杖 5 分鐘,啟用刷新令牌輪替。
___HTMLTAG_890__HTMLTAG_891___暴力保護 — 適當啟用與設定。監控登入失敗率。
___HTMLTAG_894__HTMLTAG_895___定期安全審核 — 定期檢查 Keycloak 配置。更新到最新版本。
___HTMLTAG_898__HTMLTAG_899___單獨的管理領域 — 僅將主領域用於管理。請勿混合管理用戶和企業用戶。
___HTMLTAG_902__HTMLTAG_903___監視和警報 — 將事件日誌記錄(第 18 課)與安全監視結合以進行偵測和回應。