IdM 및 SSO 서버 솔루션
아래 내용은 커스터마이징 없이 기본 관리툴 기능만 활용한 것입니다. 미처 확인하지 못한 부분이 있을 수 있습니다.
자세한 설명은 생략합니다
- Realm
- Role
- 클라이언트: Keycloak에 사용자 인증을 요구할 수 있는 개체 (서비스). SAML / OpenID Connect 로 연동 가능
- Identity Brokering / Identity Providers (이하 IdP): Google, Facebook 등 외부 인증 서비스
- User Storage Federation: LDAP 등 외부 사용자 DB
- 식별자: UUID (변경불가)
- Username (aka User ID)
- Password
- 임시 암호: 설정할 경우 로그인시 강제 변경
- 이메일
- 이메일 검증 여부
- 성 / 이름
- 부가 속성
- 임의 Key-Value 값.
- 그룹
- Role
- 생성일시
- 계정 잠금 설정
- 임시 잠금 설정 (로그인 실패에 의한)
- OTP
- 로그인 후 강제로 할 행동
- OTP 설정
- 프로필 변경
- 암호 변경
- 이메일 검증
- 연동한 IdP
- IdP측 사용자 식별자
- 토큰!!
- 연동한 서비스
- 로그인 세션
- 사용자/그룹 별로 접근 가능한 서비스 (SAML/OpenID 클라이언트) 를 제한하는 기능은 없다.
- 서비스측에서 받은 사용자 정보로 제어해야 한다.
- 그룹, Role, 접근 정책(OpenID 전용), 부가 속성 등
- 사용자 "로그인 관련" / 관리자 행위별로 자세한 정보와 함께 구조화된 형태로 기록된다.
- 당연하지만 각 서비스로 넘어간 뒤 행위는 남지 않는다.
-
LDAP -> Keycloak 동기화:
- 최초 로그인시 자동으로 가져옴
- 전체 / 증분 동기화는 콘솔에서 수동으로 또는 정기적으로 수행
-
Keycloak -> LDAP 동기화:
- 계정 생성, 수정, 삭제시 LDAP에 반영.
- Self service!
- 그룹 삭제는 반영되지 않음
- 계정 생성, 수정, 삭제시 LDAP에 반영.
-
Keycloak에서 암호 변경시 AD에도 반영.
-
인증 방식:
- LDAP binding
- Kerberos/SPNEGO SSO (미확인)
- Kerberos (폼 ID/PW)
- 이메일이 같은 계정이 있을 경우 AD 암호 확인 후 자동으로 IdP 연동됨. 이후 ID/암호 또는 IdP 방식 둘 다 로그인 가능.
- 첫 로그인시 사용할 ID, 메일, 성,이름, 암호를 지정하면 AD 계정 생성
- 폼 입력값 검증 옵션이 없음.
- 스크립트에서 값을 미리 설정하거나 거부할 수는 있음
- 서로 다른 IdP는 여러 개 연동 가능
- 인증 플로우 설정시 사용자/암호/IdP 선택 폼 없이 바로 인증 가능
- 스크립트로 특정 Google Apps 도메인 사용자만 허용 가능
- IdP Attribute Importer로 hd 속성 import. 주의: IdP 로그인으로 계정을 신규 생성하는 경우에만 입력된다.
- 스크립트에서 1에서 가져온 속성과 비교
- HOTP - 카운터/시간 방식 지원
- 해시 알고리즘, 각종 파라메터 설정 가능
- Google Authenticator에서 잘 작동
- 인증 방식에 상관 없이 OTP 사용 강제 가능
- JS로 인증 허용/거부 규칙을 설정할 수 있다. Java ScriptEngine을 사용.
- 그런데 사용이 매우 어렵다 (특히 디버깅 등)
- 예제: snippets/StripEmailDomainFromUsername.js 참조.
- 거부시 오류 메시지는 직접 선택할 수 없고 상수 몇개 중에서 선택해야 한다.
- 이걸로 서비스로 넘어갈 때 접근 거부는 안 된다. 인증 과정 플로우만 커스터마이징 할수 있고 서비스로 넘어가는 플로우는 커스터마이징 자체가 불가능.
- 테마, 지역화 기능 등 제공
- 한국어 빼고
- 관리툴에서 변경 가능한 부분은 로그인 페이지 상단의 타이틀 정도... 경고 배너도 못 넣는다.
- 약관 기능은 있으나 수정 페이지가 없음.
- 메일 발송
- 메일주소 확인
- 암호 분실
- OpenID Connect 클라이언트 AuthZ 기능
- URL path 별로 권한 설정이 가능할 것 같다.
- 클러스터링
- TODO: Keycloak LDAP bind 계정 Administrator -> 서비스 계정으로 변경
- Keycloak Security Proxy
- Reverse proxy
- 기존 애플리케이션 수정 없이 인증 붙일 수 있는 것 같다
- Kerberos/SPNEGO SSO
-
관리자 로그인이 매우 빨리 풀린다
-
Keycloak User Groups Retrieve Strategy 중
LOAD_GROUPS_BY_MEMBER_ATTRIBUTE_RECURSIVELY
는 예제로 설정한 Samba 4.3에서 제대로 작동하지 않음 이슈 -
프로비저닝 실패
- 네트워크, 타이밍 등 각종 이슈로 가끔 프로비저닝이 실패할 때가 있음.
vagrant provision VM명
으로 재시도 하거나 날리고 새로 만들것.
- 네트워크, 타이밍 등 각종 이슈로 가끔 프로비저닝이 실패할 때가 있음.
-
Vagrant 1.8.5에서 SSH 키로 VM 접속 문제 vagrant 이슈 #7610
/opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb
에 패치
LDAP 계정 자가 관리 서비스
-
암호 변경
-
암호 재설정
-
Helpdesk
-
...
Vagrant & Ansible 설치:
brew install ansible
brew cask install vagrant
구동:
vagrant up
VM 셸 진입
vagrant ssh VM 명
# ex) vagrant ssh idsvc
/etc/hosts:
192.168.33.224 dc1.example.com
192.168.33.225 idsvc.example.com keycloak.example.com pwm.example.com
192.168.33.226 ci.example.com
-
Vagrant VM:
idsvc
-
Login: admin
-
Password: admin
계정 관리 페이지: https://keycloak.example.com/realms/example/account
-
Vagrant VM:
idsvc
-
Configuration Password:
admin
-
그 외 계정은 AD와 동일
-
Vagrant VM:
dc1
-
Domain: EXAMPLE.COM
-
Login: Administrator
-
Password: admin
hsw@syscall.io
/test
test1@example.com
/test
test2@example.com
/test
-
SAML 플러그인으로 연동.
-
Jenkins 자체 설정으로 그룹별로 권한 부여
Server Administration Guide. Ch 16. Export and Import 참조
/srv/keycloak/bin/standalone.sh -Dkeycloak.migration.action=export -Dkeycloak.migration.realmName=example -Dkeycloak.migration.provider=dir -Dkeycloak.migration.dir=/vagrant/shared/export