개발 이모저모

IAM: Identity and Access Management 와 Keycloak

발짜개 2024. 10. 12. 19:48

여러 사용자가 있는 웹사이트를 구축할 때 꼭 필요한 기본 보안 요소들이 있다.

 

1. SSL/TLS 보안 프로토콜(HTTPS)을 사용해 데이터가 전송이나 저장 시 암호화

2. 사용자 인증(Authentication)과 권한 부여(Authorization)

3. 정기적 보안 업데이트 및 서버 보안 설정

4. 입력값 검증

5. 트래픽 필터링/모니터링하는 Web App Firewall 사용

6. 속도 제한과 DDos 방어

 

이 중에서 이번에는 2번, 사용자 인증과 권한부여, 즉 Access Management에 대해서 다뤄보려고 한다.

Authentication과 Authorization

Authentication이란 접근하는 사람의 아이덴티티를 입증하는 것이고, Authorization은 사용자에게 어떤 접근 권한을 줄지 조정하는 것이다. 이 단계는 승인되지 않은 사용자가 시스템에 접근하는 것을 방지하고, 사용자가 허용된 데이터에만 접근 가능하도록 하기 때문에 꼭 필요하다.

제목에 있는 IAM은 Identity and Access Management의 약자로, 오직 적합한 사람만 필요할 때 원하는 리소스나 시스템에 안전하게 접근할 수 있도록 관리하는 시스템 및 프로세스를 말한다. 즉 누가 어디에 접근할 수 있는지 관리하는 기술과 정책을 통틀어 말한다. 이러한 시스템은 하나의 서비스를 사용해서도 구현 가능하겠지만 보통 관리자가 사용자의 권한을 제어하고 모니터링할 수 있게 해주는 여러 프로세스와 클라우드 서비스를 통해 이루어진다. 

 

Identity and Access Management Tool

기본적인 IAM 도구는 먼저 다음과 같은 기능을 제공해야 한다.

 

1. Identification

사용자가 누구인지 식별하는 단계

2. Authentication

사용자가 본인임을 증명하는 과정. 비밀번호, 생체인식(Biometric), Multi-Factor Authentication(e.g. 2FA), OTP(One-Time Password), SSO(Single Sign-On) 등이 있다. 

3. Authroization 

인증된 사용자가 어떤 자원에 접근할 수 있는지를 결정하는 과정. 주로 Role-based Access Control (RBAC), 즉 역할기반 접근제어를 통해 관리한다. 그 외에도 Attribute-Based Access Control (ABAC), Discretionary Access Control (DAC) 등 다양한 기준이 있다. 

4. User Provisioning and De-provisioning

신규 사용자를 생성하고, 권한을 부여하거나 해제하는 과정이다. 사용자가 조직에 들어오거나 떠날 때 그에 맞게 접근 권한을 관리한다.

5. Auditing and Monitoring

사용자 활동을 기록하고, 의심스러운 활동이나 보안 침해를 감지하는 과정이다. 이를 통해 보안 정책 준수 여부를 확인할 수 있다.

 

OAuth(Open Authorization)와 SAML(Security Assertion Markup Language)

사용자 접근제어를 하는 데에는 다양한 방법이 있고, 그를 구현하기 위한 여러 프로토콜들이 있지만 가장 널리 쓰이는 기본 기술은 OAuth이다.OAuth는 사용자의 로그인 데이터 없이 한 애플리케이션에서 다른 애플리케이션으로 권한 부여를 전달하는 기술 표준이, SSO(Single Sign-On) 서비스에서 다른 클라우드 애플리케이션으로 권한 부여를 전달하는 데 널리 사용된다. OAuth 토큰은 OSI 모델의 계층 7에서 전송되며, HTTPS를 사용하여 암호화된다.

 

또 다른 프로토콜 SAML은 오직 Authentication만을 위한 프로토콜이다. SAML과 OAuth는 서로 다른 용도로 사용되지만, 둘 다 SSO와 함께 사용되는 경우가 많다. OpenID Connect는 OAuth기술을 바탕으로 만들어진 인증 방법이며, 추가적인 JWT(JSON Web Token)을 사용한다.

 

키클록(Keycloak)

대표적인 IAM 도구로는 AWS IAM, Azure Active Directory(Azure AD). Okta, Auth0, Ping Identity 등이 있다. 그중 오늘은 오픈소스 IAM 도구인 Keycloak에 대해서 자세히 알아보자.

 

키클록은 IAM 도구이니만큼 통합된 사용자 관리(User Federation)를 할 수 있게 도와준다. 사용자 등록, 로그인, 비밀번호 재설정, 사용자 인증 등을 여러 애플리케이션에서 중앙 집중식으로 관리할 수 있다. 또한 OAuth2, OpenID Connect, SAML과 같은 다양한 인증 프로토콜을 지원하며, Google, Facebook 등과 같은 소셜 로그인도 가능하다. 역할 기반 접근 제어(RBAC) 스타일을 사용하여근 제어를 관리한다. 그 외에도 MFA(다단계 인증), 사용자 세션 관리, 감사 로그, 사용자 동기화 등의 기능을 제공하여 보안을 강화할 수 있으며. UI와 API는 사용자의 요구에 맞게 커스터마이즈할 수 있어, 각 서비스의 요구사항에 맞는 솔루션을 구현할 수 있다. 더 자세한 기능들은 여기서 볼 수 있다.

 

키클록을 사용하며 주의해야 할 점으로는 설정이 복잡해질 수 있고, 잘못된 설정은 보안 취약점을 초래할 수 있다는 점이다. 따라서 초기 설정 시 충분한 주의가 필요하다. 또 대규모 사용자 환경에서는 성능이 저하될 수 있으므로 클러스터링 및 부하 분산을 통해 성능을 개선해야 한다. SSL/TLS를 사용하여 사용자 데이터와 인증 정보가 안전하게 전송 및 저장되도록 보안을 강화해야 한다. 또한 Keycloak에 의존하는 시스템을 운영하고 있는데 Keycloak이 중단되면 서비스가 영향을 받을 수 있기에 이중화 및 백업 계획을 마련해두어야 한다. 또한 권한과 역할이 자주 바뀐다면 정기적인 감사 및 검토를 통해 불필요한 권한이 부여되지 않도록 관리해야 한다.

 

키클록 사용법과 개념

사용자(users)
사용자는 시스템에 로그인할 수 있는 엔터티를 의미한다. 사용자에게는 이메일, 사용자 이름, 주소, 전화번호, 생일 등의 속성을 부여할 수 있다. 또한, 그룹에 할당되거나 특정 역할(role)을 부여받을 수 있다.

 

인증(authentication)
사용자의 신원을 확인하고 검증하는 과정이다.

 

권한 부여(authorization)
인증된 사용자에게 접근 권한을 부여하는 절차이다.

 

자격 증명(credentials)
자격 증명은 Keycloak이 사용자의 신원을 확인하는 데 사용하는 데이터이다. 예를 들어, 비밀번호, 일회용 비밀번호(OTP), 디지털 인증서, 지문 등이 포함된다.

 

역할(roles)
역할은 사용자 유형 또는 카테고리를 식별한다. 예를 들어, 관리자(admin), 사용자(user), 매니저(manager), 직원(employee) 같은 역할이 있으며, 애플리케이션은 개별 사용자보다 역할에 접근 권한과 권한을 할당하는 것이 일반적이다. 이는 개별 사용자를 관리하는 것보다 더 간편하고 효율적이다.

 

사용자 역할 매핑(user role mapping)
사용자와 역할 간의 매핑을 정의하며, 사용자는 0개 이상의 역할에 할당될 수 있다. 이 매핑 정보는 토큰이나 어설션(assertions)에 포함되어 애플리케이션이 자원에 대한 접근 권한을 결정할 수 있다.

 

복합 역할(composite roles)
복합 역할은 다른 역할들을 결합한 역할이다. 예를 들어, '슈퍼유저(superuser)'라는 복합 역할은 '판매 관리자(sales-admin)'와 '주문 관리자(order-entry-admin)' 역할을 포함할 수 있다. 사용자가 슈퍼유저 역할에 매핑되면 두 역할을 모두 상속받는다.

 

그룹(groups)
그룹은 여러 사용자를 관리하는 단위이다. 그룹에 속성(attributes)을 정의할 수 있으며, 역할도 그룹에 매핑할 수 있다. 그룹의 멤버가 되는 사용자는 그룹에서 정의된 속성과 역할 매핑을 상속받는다.

 

영역(realms)

영역은 사용자, 자격 증명, 역할, 그룹 등을 관리하는 단위이자 서로 격리된 공간을 나타낸다.  영역 간에는 완전한 격리성이 있어, 각 영역은 자체적으로 사용자와 인증 절차를 관리한다. 따라서 단일 키클록 서버에 여러 개의 독립적인 영역을 생성할 수 있다. 각 사용자는 하나의 특정 영역에 속해서 그 영역에 로그인한다. 예를 들어 Dev, Staging, Prod 환경을 분리하거나, 단일 키클록 인스턴스에서 여러 조직의 ID 관리 시에 활용할 수 있다.

 

클라이언트(clients)
클라이언트는 Keycloak에 사용자 인증을 요청하는 객체를 말한다. 클라이언트는 주로 Keycloak을 통해 보안을 강화하거나 SSO(싱글 사인온)를 제공하는 애플리케이션 및 서비스로 구성된다. 또한, 클라이언트는 네트워크에서 다른 서비스 호출 시 보안을 유지하기 위해 액세스 토큰이나 신원 정보를 요청할 수 있다. 클라이언트는 OpenID Connect나 SAML 같은 다양한 프로토콜을 사용하여 키클록과 상호작용한다. Redirection URL, 허용된 리소스 등의 파라미터를 지정하여 클라이언트를 구성해야 한다. 

 

클라이언트 어댑터(client adapters)
클라이언트 어댑터는 Keycloak과 통신하고 보안을 적용하기 위해 애플리케이션 환경에 설치하는 플러그인이다. Keycloak은 다양한 플랫폼에 맞는 어댑터를 제공하며, 일부 서드파티 어댑터도 지원한다.

 

동의(consent)
관리자가 클라이언트가 인증 과정에 참여하기 전에 사용자의 동의를 받도록 설정할 수 있다. 사용자가 자격 증명을 제공한 후, Keycloak은 클라이언트가 요청하는 로그인 정보와 신원 정보를 표시하는 화면을 사용자에게 보여준다. 사용자는 해당 요청을 승인할지 선택할 수 있다.

 

클라이언트 스코프(client scopes)
클라이언트를 등록할 때, 프로토콜 매퍼(protocol mappers)와 역할 스코프 매핑(role scope mapping)을 정의해야 한다. 공통 설정을 여러 클라이언트 간에 공유하기 위해 클라이언트 스코프를 사용할 수 있다. 이는 스코프 매개변수에 따라 조건부로 클레임이나 역할을 요청하는 데 유용하다.

 

클라이언트 역할(client role)
클라이언트는 클라이언트 전용 역할을 정의할 수 있다. 클라이언트 역할은 클라이언트에만 해당하는 고유한 역할 네임스페이스를 가진다.

 

아이덴티티 토큰(identity token)
사용자의 신원 정보를 포함한 토큰이다. OpenID Connect 프로토콜에서 사용된다.

 

액세스 토큰(access token)
서비스에 대한 접근 권한을 부여하는 HTTP 요청에 포함될 수 있는 토큰이다. OpenID Connect 및 OAuth 2.0 사양에서 사용된다.

 

어설션(assertion)
사용자에 대한 정보를 포함한 데이터로, 주로 SAML 인증 응답에 포함되어 인증된 사용자의 신원 메타데이터를 제공한다.

 

서비스 계정(service account)
각 클라이언트에는 기본적으로 서비스 계정이 내장되어 있으며, 이를 통해 액세스 토큰을 받을 수 있다.

 

직접 권한 부여(direct grant)
클라이언트가 사용자를 대신해 REST API 호출을 통해 액세스 토큰을 얻는 방식이다.

 

프로토콜 매퍼(protocol mappers)
각 클라이언트에 대해 OIDC 토큰 또는 SAML 데이터에 어떤 요청이나 정보를 포함할지를 구성할 수 있다. 이를 통해 클라이언트별로 맞춤화된 신원 정보를 제공할 수 있다.

 

세션(session)
사용자가 로그인하면, 로그인 세션을 관리하는 세션이 생성된다. 세션에는 사용자가 언제 로그인했는지, 어떤 애플리케이션이 SSO에 참여했는지와 같은 정보가 포함된다. 세션 정보는 관리자와 사용자가 조회할 수 있다.

 

사용자 연동 제공자(user federation provider)
Keycloak은 자체적으로 사용자와 자격 증명을 저장하고 관리할 수 있지만, LDAP 또는 Active Directory 같은 기존의 외부 서비스와 연동하여 자격 증명을 검증하고 신원 정보를 가져올 수도 있다.

 

아이덴티티 제공자(identity provider, IDP)
아이덴티티 제공자는 사용자를 인증할 수 있는 서비스이다. Keycloak도 하나의 IDP로 작동할 수 있다.

 

아이덴티티 제공자 연동(identity provider federation)
Keycloak은 다른 IDP에 인증을 위임할 수 있다. 예를 들어, 구글이나 페이스북을 통한 소셜 로그인도 이러한 IDP 연동의 예시이다. 또한, OpenID Connect 또는 SAML 2.0 IDP와 연동하여 인증을 위임할 수 있다.

 

아이덴티티 제공자 매퍼(identity provider mappers)
IDP 연동 시, 외부 IDP로부터 받은 토큰과 신원정보(assertion)를 사용자 및 세션 속성으로 매핑할 수 있다. 이를 통해 외부 IDP의 신원 정보를 클라이언트에 전달할 수 있다.

 

필수 작업(required actions)
필수 작업은 인증 과정 중 사용자가 반드시 수행해야 하는 작업이다. 예를 들어, 관리자는 매월 사용자에게 비밀번호를 재설정하도록 요구할 수 있으며, 이를 위해 비밀번호 업데이트 필수 작업을 설정할 수 있다.

 

인증 흐름(authentication flows)
인증 흐름은 사용자가 시스템과 상호작용할 때 수행해야 하는 워크플로우를 정의한다. 로그인 흐름은 어떤 자격 증명 유형이 필요한지, 등록 흐름은 사용자가 입력해야 할 프로필 정보와 봇을 필터링하기 위한 reCAPTCHA 사용 여부 등을 정의할 수 있다. 자격 증명 재설정 흐름은 비밀번호 재설정을 위한 작업을 정의한다.

 

이벤트(events)
이벤트는 관리자가 확인하고 연결할 수 있는 감사 스트림이다.

 

테마(themes)
Keycloak에서 제공하는 모든 화면은 테마로 구성되어 있다. 테마는 HTML 템플릿과 스타일시트를 정의하며, 필요에 따라 이를 재정의할 수 있다.

 

출처: https://www.keycloak.org/docs/latest/server_admin/#core-concepts-and-terms