Documentation

21. LDAP 인증 설정

참고

연결하려는 LDAP 서버에 자체 서명된 인증서가 있거나 회사 내부 CA(인증 기관)에서 서명한 인증서가 있는 경우 CA 인증서를 시스템의 신뢰할 수 있는 CA에 추가해야 합니다. 그러지 않고 LDAP 서버에 연결하면 인증서 발행자를 인식할 수 없다는 오류가 발생합니다.

관리자는 컨트롤러 사용자의 계정 인증 정보 소스로 LDAP를 사용합니다. 사용자 인증이 제공되지만 사용자 권한과 인증 정보가 동기화되지는 않습니다. 조직 멤버십(및 조직 관리자)과 팀 멤버십은 동기화할 수 있습니다.

이렇게 구성하면 LDAP 사용자 이름과 암호로 로그인한 사용자는 생성된 컨트롤러 계정을 자동으로 받고 일반 사용자 또는 조직 관리자로 조직에 자동 배치될 수 있습니다.

LDAP 로그인을 통해 생성된 사용자는 사용자 이름, 성, 이름을 변경하거나 로컬 암호를 직접 설정할 수 없습니다. 다른 필드 이름을 편집하는 것을 제한하기 위해 이 구성을 조정할 수도 있습니다.

컨트롤러의 LDAP 통합을 구성하려면 다음을 수행합니다.

  1. 먼저 전체 LDAP 구조를 읽을 수 있는 권한이 부여된 사용자를 LDAP에 생성합니다.

  2. LDAP 서버에 성공적으로 쿼리할 수 있는지 테스트합니다. ldapsearch 명령을 사용하십시오. 이 명령은 컨트롤러 시스템의 명령행과 다른 Linux 및 OSX 시스템에 설치할 수 있는 명령행 툴입니다. 다음 명령을 사용하여 ldap 서버를 쿼리합니다. 여기서 *josie*와 *Josie4Cloud*는 설정에 적합한 속성으로 교체됩니다.

ldapsearch -x  -H ldap://win -D "CN=josie,CN=Users,DC=website,DC=com" -b "dc=website,dc=com" -w Josie4Cloud

여기서 ``CN=josie,CN=users,DC=website,DC=com``은 연결하는 사용자의 고유 이름입니다.

참고

ldapsearch 유틸리티는 |at|와 함께 자동으로 사전 설치되지 않지만 openldap-clients 패키지에서 설치할 수 있습니다.

  1. automation controller 사용자 인터페이스에서 왼쪽 탐색의 **설정**을 클릭하고 인증 옵션 목록의 **LDAP 설정**을 클릭하여 선택합니다.

참고

구성할 서버를 지정하여 여러 LDAP 서버를 구성할 수 있습니다. 구성하지 않는 경우 서버를 **기본값**으로 유지합니다.

_images/configure-tower-auth-ldap-servers.png

동등한 API 끝점은 AUTH_LDAP_*``를 ``AUTH_LDAP_1_*, AUTH_LDAP_2_*, …, ``AUTH_LDAP_5_*``와 같이 반복적으로 표시하여 서버 지정을 나타냅니다.

  1. 편집**을 클릭하고 연결할 LDAP 서버 주소를 텍스트 필드에 표시된 것과 동일한 포맷으로 **LDAP 서버 URI 필드에 입력합니다. 다음은 예제입니다.

_images/configure-tower-auth-ldap-server-uri.png
  1. LDAP 바인딩 DN 텍스트 필드에 고유 이름을 입력하여 컨트롤러가 LDAP 서버에 연결(바인딩)하는 데 사용하는 사용자를 지정합니다. 다음은 예제 ``CN=josie,CN=users,DC=website,DC=com``을 사용합니다.

_images/configure-tower-auth-ldap-bind-dn.png
  1. LDAP 바인딩 암호 텍스트 필드에 바인딩 사용자에게 사용할 암호를 입력합니다. 이 예제에서 암호는 〈passme’입니다.

_images/configure-tower-auth-ldap-bind-pwd.png
  1. 해당 이름이 sAMAccountName 키에 저장된 경우 **LDAP 사용자 DN 템플릿**은 ``(sAMAccountName=%(user)s)``로 채워집니다. Active Directory는 사용자 이름을 ``sAMAccountName``에 저장합니다. 마찬가지로, OpenLDAP의 경우 키가 ``uid``이므로 줄이 ``(uid=%(user)s)``가 됩니다.

  2. LDAP 그룹 유형 드롭다운 메뉴 목록에서 그룹 유형을 클릭하여 선택합니다.

LDAP 그룹 유형은 다음과 같습니다.

  • PosixGroupType

  • GroupOfNamesType

  • GroupOfUniqueNamesType

  • ActiveDirectoryGroupType

  • OrganizationalRoleGroupType

  • MemberDNGroupType

  • NISGroupType

  • NestedGroupOfNamesType

  • NestedGroupOfUniqueNamesType

  • NestedActiveDirectoryGroupType

  • NestedOrganizationalRoleGroupType

  • NestedMemberDNGroupType

  • PosixUIDGroupType

컨트롤러에서 지원하는 LDAP 그룹 유형은 기본 `django-auth-ldap library`_를 활용합니다.

**LDAP 그룹 유형**마다 사용하는 매개변수가 다를 수도 있습니다. 이에 따라 컨트롤러는 LDAP_GROUP_TYPE_PARAMS``를 노출하여 관련 정보를 표시합니다. ``LDAP_GROUP_TYPE_PARAMS``는 컨트롤러를 통해 kwargs로 변환된 선택한 LDAP 그룹 유형 클래스에 전달되는 사전입니다. LDAP 그룹 유형에서 사용하는 가지 일반 매개변수는 ``name_attr``과 ``member_attr``입니다. 여기서 ``name_attr``의 기본값은 ``cn, ``member_attr``의 기본값은 ``member``입니다.

{"name_attr": "cn", "member_attr": "member"}

특정 LDAP 그룹 유형에 필요한 매개변수를 확인하려면 클래스 init 매개변수에 관한 django_auth_ldap 문서를 참조하십시오.

  1. 그룹 내의 사용자가 컨트롤러에 액세스할 수 있도록 하는 그룹 고유 이름을 텍스트 필드에 표시된 것과 동일한 포맷으로 LDAP 필요 그룹 필드에 입력합니다. 이 예제에서는 ``CN=controller Users,OU=Users,DC=website,DC=com``을 사용합니다.

_images/configure-tower-auth-ldap-req-group.png
  1. 그룹 내의 사용자가 컨트롤러에 액세스할 수 없도록 하는 그룹 고유 이름을 텍스트 필드에 표시된 것과 동일한 포맷으로 LDAP 거부 그룹 필드에 입력합니다. 이 예제에서는 필드를 비워 둡니다.

  2. **LDAP 시작 TLS**는 기본적으로 비활성화되어 있습니다. LDAP 연결이 SSL을 사용하지 않을 때 TLS를 활성화하려면 토글을 클릭하여 **ON**으로 전환합니다.

_images/configure-tower-auth-ldap-start-tls.png
  1. 인증하는 동안 사용자를 검색할 위치를 텍스트 필드에 표시된 것과 동일한 포맷으로 LDAP 사용자 검색 필드에 입력합니다. 이 예제에서는 다음을 사용합니다.

[
"OU=Users,DC=website,DC=com",
"SCOPE_SUBTREE",
"(cn=%(user)s)"
]

첫 번째 줄은 LDAP 트리에서 사용자를 검색할 위치를 지정합니다. 위의 예제에서는 ``DC=website,DC=com``부터 재귀적으로 사용자를 검색합니다.

두 번째 줄은 사용자를 검색할 범위를 지정합니다.

  • SCOPE_BASE: 이 값은 기본 DN의 항목만 검색하는 데 사용되며 해당 항목만 반환됩니다.

  • SCOPE_ONELEVEL: 이 값은 기본 DN보다 한 수준 아래의 모든 항목을 검색하는 데 사용되지만, 기본 DN은 포함하지 않으며 기본 DN보다 두 수준 이상 아래의 항목도 모두 포함하지 않습니다.

  • SCOPE_SUBTREE: 이 값은 전체 하위 수준에서 모든 항목을 검색하는 데 사용되며 지정된 기본 DN을 포함합니다.

세 번째 줄은 사용자 이름이 저장된 키 이름을 지정합니다.

_images/configure-tower-authen-ldap-user-search.png

참고

검색 쿼리가 여러 개인 경우 올바른 구문은 다음과 같습니다.

[
  [
  "OU=Users,DC=northamerica,DC=acme,DC=com",
  "SCOPE_SUBTREE",
  "(sAMAccountName=%(user)s)"
  ],
  [
  "OU=Users,DC=apac,DC=corp,DC=com",
  "SCOPE_SUBTREE",
  "(sAMAccountName=%(user)s)"
  ],
  [
  "OU=Users,DC=emea,DC=corp,DC=com",
  "SCOPE_SUBTREE",
  "(sAMAccountName=%(user)s)"
  ]
]
  1. LDAP 그룹 검색 텍스트 필드에서 검색할 그룹과 검색 방법을 지정합니다. 이 예제에서는 다음을 사용합니다.

 [
"dc=example,dc=com",
"SCOPE_SUBTREE",
"(objectClass=group)"
 ]
  • 첫 번째 줄은 그룹을 검색할 기본 DN을 지정합니다.

  • 두 번째 줄은 범위를 지정하며 사용자 지시문 범위와 같습니다.

  • 세 번째 줄은 사용 중인 LDAP에 있는 그룹 오브젝트의 ``objectclass``를 지정합니다.

_images/configure-tower-authen-ldap-group-search.png
  1. LDAP 사용자 속성 맵 텍스트 필드에 사용자 속성을 입력합니다. 이 예제에서는 다음을 사용합니다.

{
"first_name": "givenName",
"last_name": "sn",
"email": "mail"
}

위의 예제에서는 sn 키에서 사용자를 성으로 검색합니다. 사용자에게 동일한 LDAP 쿼리를 사용하여 사용자가 저장된 키를 확인할 수 있습니다.

_images/configure-tower-auth-ldap-user-attrb-map.png
  1. 그룹별 LDAP 사용자 플래그 텍스트 필드에 사용자 프로필 플래그를 입력합니다. 이 예제에서는 다음 구문을 사용하여 LDAP 사용자를 《Superusers》 및 《Auditors》로 설정합니다.

{
"is_superuser": "cn=superusers,ou=groups,dc=website,dc=com",
"is_system_auditor": "cn=auditors,ou=groups,dc=website,dc=com"
}

위의 예제에서는 프로필에 슈퍼유저 또는 감사자로 플래그가 지정된 사용자를 검색합니다.

_images/configure-tower-auth-ldap-user-flags.png
  1. 매핑 필드를 작성하는 방법에 대한 자세한 내용은 :ref:`ag_ldap_org_team_maps`을 참조하십시오.

  2. 완료되면 **저장**을 클릭합니다.

이 양식에 이러한 값을 입력하면 이제 LDAP를 사용하여 성공적으로 인증할 수 있습니다.

참고

컨트롤러가 적극적으로 사용자를 동기화하지는 않지만 초기 로그인 과정에서 사용자가 생성됩니다. LDAP 인증과 관련된 성능을 개선하려면 |atu|에서 :ref:`ug_ldap_auth_perf_tips`을 참조하십시오.

21.1. 추천

Active Directory는 쿼리된 오브젝트를 해당 데이터베이스에서 사용할 수 없는 경우 《추천》을 사용합니다. 이 기능은 Django LDAP 클라이언트에서는 제대로 작동하지 않으며, 대부분의 경우 추천을 비활성화하는 것이 좋습니다. /etc/tower/conf.d/custom.py 파일에 다음 줄을 추가하여 LDAP 추천을 비활성화합니다.

AUTH_LDAP_GLOBAL_OPTIONS = {
    ldap.OPT_REFERRALS: False,
}

참고

automation controller 버전 2.4.3 이상에서는 《추천》이 기본적으로 비활성화되어 있습니다. 이전 버전의 컨트롤러를 실행하는 경우 이 매개변수를 구성 파일에 추가하는 것이 좋습니다.

매핑 필드를 작성하는 방법에 대한 자세한 내용은 :ref:`ag_ldap_org_team_maps`을 참조하십시오.

21.2. LDAP에 로깅 활성화

LDAP에 로깅을 활성화하려면 설정 구성 창에서 수준을 ``DEBUG``로 설정해야 합니다.

  1. 왼쪽 탐색 창에서 **설정**을 클릭하고 시스템 옵션 목록에서 **로깅 설정**을 클릭하여 선택합니다.

  2. **편집**을 클릭합니다.

  3. 로깅 수집기 수준 임계값 필드를 **디버그**로 설정합니다.

_images/settings-system-logging-debug.png
  1. **저장**을 클릭하여 변경 사항을 저장합니다.

21.3. LDAP 조직 및 팀 매핑

그다음에는 LDAP 속성을 기준으로 컨트롤러 조직에 배치되는 사용자를 제어해야 합니다. 즉, 조직 관리자/사용자와 LDAP 그룹 간 매핑합니다.

키는 조직 이름이며 조직은 없을 시 생성됩니다. 값은 각 조직의 멤버십 옵션을 정의하는 사전입니다. 각 조직에서는 자동으로 조직의 사용자가 되는 그룹과 조직을 관리할 수 있는 그룹을 지정할 수 있습니다.

admins: 없음, True/False, 문자열 또는 문자열 목록/튜플.
  • **없음**인 경우 조직 관리자가 LDAP 값을 기준으로 업데이트되지 않습니다.

  • **True**인 경우 LDAP의 모든 사용자가 조직 관리자로 자동 추가됩니다.

  • **False**인 경우 LDAP 사용자가 조직 관리자로 자동 추가되지 않습니다.

  • 문자열 또는 문자열 목록인 경우 지정된 그룹과 일치하면 조직에 추가되는 그룹 DN을 지정합니다.

remove_admins: True/False. 기본값은 **False**입니다.
  • **True**인 경우 지정된 그룹의 멤버가 아닌 사용자는 조직의 관리 목록에서 제거됩니다.

users: 없음, True/False, 문자열 또는 문자열 목록/튜플. **admins**와 동일한 규칙이 적용됩니다.

remove_users: True/False. 기본값은 **False**입니다. **remove_admins**와 동일한 규칙이 적용됩니다.

{
"LDAP Organization": {
  "admins": "cn=engineering_admins,ou=groups,dc=example,dc=com",
  "remove_admins": false,
  "users": [
    "cn=engineering,ou=groups,dc=example,dc=com",
    "cn=sales,ou=groups,dc=example,dc=com",
    "cn=it,ou=groups,dc=example,dc=com"
  ],
  "remove_users": false
},
"LDAP Organization 2": {
  "admins": [
    "cn=Administrators,cn=Builtin,dc=example,dc=com"
  ],
  "remove_admins": false,
  "users": true,
  "remove_users": false
}
}

팀 멤버(사용자)와 LDAP 그룹 간 매핑. 키는 팀 이름이며 없을 시 생성됩니다. 값은 각 팀의 멤버십 옵션을 정의하는 사전이며, 옵션별로 다음 매개변수를 포함할 수 있습니다.

organization: 문자열. 팀이 속하는 조직의

이름입니다. 조직과 팀 이름이 조합되지 않으면 팀이 생성됩니다. 조직이 없는 경우 먼저 생성됩니다.

users: 없음, True/False, 문자열 또는 문자열 목록/튜플.

  • **없음**인 경우 팀 멤버가 업데이트되지 않습니다.

  • **True/False**인 경우 모든 LDAP 사용자가 팀 멤버로 추가되거나 제거됩니다.

  • 문자열 또는 문자열 목록인 경우 그룹 DN을 지정합니다. 사용자가 이러한 그룹 중 하나의 멤버이면 팀 멤버로 추가됩니다.

remove: True/False. 기본값은 **False**입니다. **True**인 경우 지정된 그룹의 멤버가 아닌 사용자는 팀에서 제거됩니다.

{
"LDAP Engineering": {
  "organization": "LDAP Organization",
  "users": "cn=engineering,ou=groups,dc=example,dc=com",
  "remove": true
},
"LDAP IT": {
  "organization": "LDAP Organization",
  "users": "cn=it,ou=groups,dc=example,dc=com",
  "remove": true
},
"LDAP Sales": {
  "organization": "LDAP Organization",
  "users": "cn=sales,ou=groups,dc=example,dc=com",
  "remove": true
}
}