keycloak - 오픈 소스 Identity and Access Management , IdAM
keycloak는 오픈소스 계정 접근 제어를 관리 할 수 있는 솔루션입니다.
SSO (Single Sign On), Open-ID, 등과 같은 애플리케이션 과 서비서의 인증 기술이며 로그인과 접근을 관리 할 수 있는 다양한 기능을 제공 합니다.
ㅁ keycloak 의 주요 기능
- SSO(Single Sign-On) : 여러 응용 프로그램에 한 번 로그인
- 표준 인증 프로토콜 : OpenID Connect, OAuth 2.0 및 SAML 2.0
- 중앙 집중식 관리 : 관리자 및 사용자의 통합 관리
- 어댑터 : 응용 프로그램 및 서비스를 쉽게 보호/ 연계
- LDAP 및 Active Directory: 기존 사용자 디렉터리에 연결
- 소셜 로그인 지원: 소셜 로그인을 쉽게 활성화
- 아이덴티티 브로커링 : OpenID Connect 또는 SAML 2.0 IdP
- 고성능 : 가볍고, 빠르고, 확장 가능
- 클러스터링: 확장성 및 가용성 지원 가능
- UI 테마 : 모양과 느낌 사용자 지정
- 확장성 : 코드를 통해 사용자 지정
- 비밀번호 정책 : 암호 정책 사용자 지정
ㅁ keycloak 설치
1. keycloak - download
https://www.keycloak.org/downloads.html
https://github.com/keycloak/keycloak/releases/download/26.0.7/keycloak-26.0.7.tar.gz
2. open-jdk 설치
# Java 17(Java SDK 17) 이상 설치
# Java 17(Java SDK 17) 이상 설치
# yum search java
# yum install java-21-openjdk.x86_64
3. 설치 및 실행
다운 받은 keycloak 바이너리를 특정 디렉토리에 압축 해제하고 실행 하면 됩니다.
# mkdir /svc
# cd /svc
# tar xvzf keycloak-26.0.7.tar.gz
# ln -s keycloak-26.0.7 keycloak
# cd keycloak
# start.sh
--------------------------------
#./bin/kc.sh start-dev &
이 옵션을 사용하면 개발 모드에서 Keycloak을 시작합니다.
- Linux에서 다음을 실행합니다.
bin/kc.sh start-dev
- Windows에서 다음을 실행합니다.
bin\kc.bat start-dev
4. 관리자 웹 콘솔 확인
keycloak를 실행하고 웹브라우저에서 Keycloak 관리 콘솔 웹 UI 를 확인 합니다.
http://127.0.0.1:8080
Listening on: http://0.0.0.0:8080
처음 접근하면 아래와 같은 화면이 보입니다.
임시 관리 사용자를 열려면( http://localhost:8080/ )
서버를 시작할 때 환경 변수를 설정 KC_BOOTSTRAP_ADMIN_USERNAME 과 KC_BOOTSTRAP_ADMIN_PASSWORD 을 설정하여야 합니다.
(참고) Keycloak 구성 - Keycloak - 처음 구동 환경 설정
5. 초기 관리자를 생성하도록 최초 구동하는 방법
최초 구동시 관리자 계정이 필요한데 환경 변수를 이용하여 최초 구동시 관리자계정을 생성하도록 하여야 합니다.
# keycloak를 한번이라도 실행을 하면 환경 설정이 추가 되므로 삭제하여 초기화합니다.
# cd ${kc.home.dir}
# rm -rf ./data
(중요) 반드시 위의 초기화 이후 아래와 같이 환경 변수를 추가하여 실행해야 합니다.
# set keycloak start init varialbes in bash
export KC_BOOTSTRAP_ADMIN_USERNAME="admin"
export KC_BOOTSTRAP_ADMIN_PASSWORD="passwd"
export KEYCLOAK_ADMIN="admin"
export KEYCLOAK_ADMIN_PASSWORD="passwd"
# keycloak를 실행합니다.
#./bin/kc.sh start-dev --verbose
6. 관리자 콘솔에 로그인 합니다.
웹브라우저로 관리자 콘솔에 접속하면 자동으로 Admin 로그인 창으로 이동하면서 인증을 할 수 있습니다. 이때 환경변수에서 설정한 계정과 패스워드를 입력하면 로그인이 됩니다.
# 웹브라우저의 로그인합니다.
http://localhost:8080
or
http://localhost:8080/admin
# 웹브라우저에서 /admin 으로 접근
http://localhost:8080/admin
http://localhost:8080/admin/master/console/
야래 내용은 초기화 하지 않고 이것 저것 해봤던 내용인데 참고로 남겨 둡니다.
관리자 기동을 위해서 key를 생성하여 로그인도 가능하고, kcadm.sh 을 이용하여 계정을 생성할 수도 있답니다.
그런데 잘 안되어서 나중에 시행착오를 줄이는 차원에서 실행 했던 내용들을 남겨두었습니다.
초기 관리자 만드는 다른 방법들로 아래 내용은 작동이 되지 않습니다.ㅜㅜ
로컬 연결(localhost)을 사용하여 액세스하는 웹 프런트엔드를 사용하여 초기 관리자 사용자를 만들 수 있습니다.
환경 변수를 사용하여 이 사용자를 만들 수 있습니다. 초기 관리자 사용자 이름 및 초기 관리자 암호를 설정합니다.
# Start Case 1
- 데이터를 초기화 하여 실행합니다.
# 초기화를 하고 실행합니다.
# cd keycloak_home
# rm -rf ./data
# ./bin/kc.sh start-dev --verbose
다음과 같이 admin 계정으로 로그인이 오류가 발생합니다.
2025-01-03 06:17:34,677 WARN [org.keycloak.events] (executor-thread-4) type="LOGIN_ERROR", realmId="1c3c6769-00cb-4a3d-95de-cad239910ecb", realmName="master", clientId="security-admin-console", userId="null", ipAddress="10.0.2.2", error="user_not_found", auth_method="openid-connect", auth_type="code", redirect_uri="http://localhost:8080/admin/master/console/", code_id="566bf6db-dda7-4280-a146-27ede4be4153", username="admin"
- kcadm.sh 를 이용하여 계정을 생성하는 방법
계정은 "admin" 으로 하고 Password를 입력하여 설정하고 로그인 하면됩니다.
# ./bin/kcadm.sh config credentials --server http://localhost:8080 --realm master --user admin
Logging into http://localhost:8080 as user admin of realm master
Enter password:
Invalid user credentials [invalid_grant]
or
$ ./bin/kcadm.sh config credentials --server http://localhost:8080 --realm master --user admin --password passwd
$ ./bin/kcadm.sh create users -r master -s username=admin -s enabled=true -s email=admin@example.com -s emailVerified=true --server http://localhost:8080
$ ./bin/kcadm.sh set-password -r master --username admin --new-password passwd --server http://localhost:8080
# keytool -importpass -alias kc.db-password -keystore keystore.p12 -storepass keystorepass -storetype PKCS12 -v
# config-keystore-password=1111
#bin/kc.sh start --config-keystore=./keystore.p12 --config-keystore-password=1111 --config-keystore-type=PKCS12
#./bin/kc.sh start-dev --bootstrap-admin-password 1111 --bootstrap-admin-username admin
root 33758 33677 99 05:16 pts/1 00:00:59 java -Dkc.config.build-and-exit=true -Djava.util.concurrent.ForkJoinPool.common.threadFactory=io.quarkus.bootstrap.forkjoin.QuarkusForkJoinWorkerThreadFactory -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.err.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -XX:+ExitOnOutOfMemoryError -Djava.security.egd=file:/dev/urandom -XX:+UseG1GC -XX:FlightRecorderOptions=stackdepth=512 -Xms64m -Xmx512m --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base java.security=ALL-UNNAMED -Duser.language=en -Duser.country=US -Dkc.home.dir=/svc/keycloak-26.0.7/bin/.. -Djboss.server.config.dir=/svc/keycloak-26.0.7/bin/../conf -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Dpicocli.disable.closures=true -Dquarkus-log-max-startup-records=10000 -cp /svc/keycloak-26.0.7/bin/../lib/quarkus-run.jar io.quarkus.bootstrap.runner.QuarkusEntryPoint --profile=dev start-dev --bootstrap-admin-password 1111 --bootstrap-admin-username admin
# Start Case 2
export KC_BOOTSTRAP_ADMIN_USERNAME=<username>
export KC_BOOTSTRAP_ADMIN_PASSWORD=<password>
# bin/kc.sh build
# bin/kc.bat build
설치 환경의 Config를 확인 합니다.
./bin/kc.sh show-config
Current Mode: production
Current Configuration:
kc.bootstrap-admin-password = ******* (ENV)
kc.bootstrap-admin-username = admin (ENV)
kc.config.args = show-config (SysPropConfigSource)
kc.config.built = true (SysPropConfigSource)
kc.db = dev-file (Persisted)
kc.log-console-output = default (classpath keycloak.conf)
kc.optimized = true (Persisted)
kc.version = 26.0.7 (SysPropConfigSource)
#
# ./bin/kc.sh start-dev
Updating the configuration and installing your custom providers, if any. Please wait.
# Start Case 4
Sertkey를 이용한 설정
[keycloak/conf/keycloak.conf]
# The file path to a private key in PEM format.
#https-certificate-key-file=${kc.home.dir}conf/server.key.pem
# The file path to a private key in PEM format.
https-certificate-key-file=${kc.home.dir}/conf/server.key.pem
https-certificate-file=${kc.home.dir}/conf/server.crt.pem
Key를 생성합니다.
# openssl req -new -x509 -keyout server.key.pem -out server.crt.pem -days 365 -nodes
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:KO
State or Province Name (full name) []:comtest
Locality Name (eg, city) [Default City]:test
Organization Name (eg, company) [Default Company Ltd]:com
Organizational Unit Name (eg, section) []:dev
Common Name (eg, your name or your server's hostname) []:
Email Address []:
# - 파일을 kc.home/conf로 복사
# cp server.*.pem ./conf/
Start Keycloak: Start Keycloak with the HTTPS configuration.
# ./bin/kc.sh show-config
# ./bin/kc.sh start-dev
다음과 같은 오류는 아래 고급 설정으로 해결 하면 될 것 같습니다.
(참고) https://www.keycloak.org/server/configuration
# ./bin/kc.sh start
Key material not provided to setup HTTPS. Please configure your keys/certificates or start the server in development mode.
고급 구동 스크립트 환경 customizing
구동 환경을 확인 합니다.
bin/kc.[sh|bat] start --help
구동 옵션
명령줄 매개 변수 | --db-url=cliValue |
환경 변수 | KC_DB_URL=envVarValue |
구성 파일 | db-url=confFileValue |
Java KeyStore 파일 | kc.db-url=keystoreValue |
다음 예제에서는 세 가지 구성 소스에 대한 구성 형식을 보여줍니다
bin/kc.[sh|bat] start --db-url-host=mykeycloakdb
# 환경 변수
export KC_DB_URL_HOST=mykeycloakdb
# conf/keycloak.conf
db-url-host=${MY_DB_HOST:mydb}
bin/kc.[sh|bat] --config-file./conf/keycloak.conf start
(참고)
- OpenJDK - 키클럭 (keycloak.org) 설치 가이드
KeyCloak를 SSH에 연동하기
# /root/keycloak/src/pam-oauth2 를 다운받아 설치한다.
# find / -name pam_nologin.so
/usr/lib64/security/pam_nologin.so
# sudo nano /etc/ssh/sshd_config
+ UsePAM yes
#sudo nano /etc/pam.d/sshd
+ auth required pam_oauth2.so client_id=linux-client client_secret=your-client-secret auth_url=https://<Keycloak-URL>/auth/realms/example-realm/protocol/openid-connect/auth token_url=https://<Keycloak-URL>/auth/realms/example-realm/protocol/openid-connect/token
Bootstrap Admin:
--bootstrap-admin-client-id <client id>
Client id for the temporary bootstrap admin service account. Used only when
the master realm is created. Available only when bootstrap admin client
secret is set. Default: temp-admin.
--bootstrap-admin-client-secret <client secret>
Client secret for the temporary bootstrap admin service account. Used only
when the master realm is created. Use a non-CLI configuration option for
this option if possible.
--bootstrap-admin-password <password>
Temporary bootstrap admin password. Used only when the master realm is
created. Use a non-CLI configuration option for this option if possible.
--bootstrap-admin-username <username>
Temporary bootstrap admin username. Used only when the master realm is
created. Available only when bootstrap admin password is set. Default:
temp-admin.
Database:
--db <vendor> The database vendor. Possible values are: dev-file, dev-mem, mariadb, mssql,
mysql, oracle, postgres. Default: dev-file.
--db-driver <driver> The fully qualified class name of the JDBC driver. If not set, a default
driver is set accordingly to the chosen database.
--db-password <password>
The password of the database user.
--db-pool-initial-size <size>
The initial size of the connection pool.
--db-pool-max-size <size>
The maximum size of the connection pool. Default: 100.
--db-pool-min-size <size>
The minimal size of the connection pool.
--db-schema <schema> The database schema to be used.
--db-url <jdbc-url> The full database JDBC URL. If not provided, a default URL is set based on the
selected database vendor. For instance, if using 'postgres', the default
JDBC URL would be 'jdbc:postgresql://localhost/keycloak'.
--db-url-database <dbname>
Sets the database name of the default JDBC URL of the chosen vendor. If the
`db-url` option is set, this option is ignored.
--db-url-host <hostname>
Sets the hostname of the default JDBC URL of the chosen vendor. If the
`db-url` option is set, this option is ignored.
--db-url-port <port> Sets the port of the default JDBC URL of the chosen vendor. If the `db-url`
option is set, this option is ignored.
--db-url-properties <properties>
Sets the properties of the default JDBC URL of the chosen vendor. Make sure to
set the properties accordingly to the format expected by the database
vendor, as well as appending the right character at the beginning of this
property value. If the `db-url` option is set, this option is ignored.
--db-username <username>
The username of the database user.
'DevOps' 카테고리의 다른 글
Set the default Java version - update-alternatives --config java (4) | 2024.10.20 |
---|---|
Windows shell 변수에서 특정 문자를 가진 문자열을 치환 하는 방법 (8) | 2024.09.20 |
Linux Docker와 Docker Compose 설치 - Ubuntu_Red Hat_Rocky (6) | 2024.09.01 |
[Docker] 자주 사용하는 "docker exec, attach, logs" 명령어 정리 (153) | 2024.01.27 |
[Docker] 자주 사용하는 "docker volume" 명령어 정리 (115) | 2024.01.26 |
[Docker] 자주 사용하는 "docker build" 명령어 정리 (17) | 2024.01.25 |
[Docker] 자주 사용하는 "docker pull" 명령어 정리 (116) | 2024.01.24 |