5.4. 인증 및 권한 부여에 LDAP 사용
LDAP 로그인 모듈은 중앙 X.500 디렉터리 서버에 저장된 사용자 데이터에 대해 들어오는 자격 증명을 확인하여 인증 및 권한 부여를 활성화합니다. 이는 org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule 에 의해 구현됩니다.
5.4.1. 클라이언트 인증을 위한 LDAP 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제 절차에서는 LDAP를 사용하여 클라이언트를 인증하는 방법을 보여줍니다.
절차
-
<
;broker_instance_dir> /etc/broker.xml구성 파일을 엽니다. security-settings요소 내에서security-setting요소를 추가하여 권한을 구성합니다. 예를 들면 다음과 같습니다.<security-settings> <security-setting match="#"> <permission type="createDurableQueue" roles="user"/> <permission type="deleteDurableQueue" roles="user"/> <permission type="createNonDurableQueue" roles="user"/> <permission type="deleteNonDurableQueue" roles="user"/> <permission type="send" roles="user"/> <permission type="consume" roles="user"/> </security-setting> </security-settings>이전 구성은 모든 큐에 대한 특정 권한을
사용자역할의 멤버에게 할당합니다.-
<
broker-instance-dir>/etc/login.config파일을 엽니다. 사용 중인 디렉터리 서비스에 따라 LDAP 로그인 모듈을 구성합니다.
Microsoft Active Directory 디렉터리 서비스를 사용하는 경우 다음 예와 유사한 구성을 추가합니다.
activemq { org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule required debug=true initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory connectionURL="LDAP://localhost:389" connectionUsername="CN=Administrator,CN=Users,OU=System,DC=example,DC=com" connectionPassword=redhat.123 connectionProtocol=s connectionTimeout=5000 authentication=simple userBase="dc=example,dc=com" userSearchMatching="(CN={0})" userSearchSubtree=true readTimeout=5000 roleBase="dc=example,dc=com" roleName=cn roleSearchMatching="(member={0})" roleSearchSubtree=true ; };참고Microsoft Active Directory를 사용하고 있고
connectionUsername의 속성에 대해 지정해야 하는 값에 공백(예:OU=System Accounts)을 포함하는 경우, 한 쌍의 따옴표("")로 값을 묶고 백슬래시(\)를 사용하여 쌍의 이중 인용을 이스케이프해야 합니다. 예를 들어connectionUsername="CN=Administrator,CN=Users,OU=\"System Accounts\",DC=example,DC=com"입니다.ApacheDS 디렉터리 서비스를 사용하는 경우 다음 예와 유사한 구성을 추가합니다.
activemq { org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule required debug=true initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory connectionURL="ldap://localhost:10389" connectionUsername="uid=admin,ou=system" connectionPassword=secret connectionProtocol=s connectionTimeout=5000 authentication=simple userBase="dc=example,dc=com" userSearchMatching="(uid={0})" userSearchSubtree=true userRoleName= readTimeout=5000 roleBase="dc=example,dc=com" roleName=cn roleSearchMatching="(member={0})" roleSearchSubtree=true ; };debug-
디버깅을 끄십시오 (
true) off (false). 기본값은false입니다. initialContextFactory-
Must always be set to
com.sun.jndi.ldap.LdapCtxFactory connectionURL-
LDAP URL을 사용하는 디렉터리 서버의 위치, __<ldap://Host:Port>. 디렉터리 트리에 슬래시(
/)를 추가한 다음 디렉터리 트리에 특정 노드의 DN을 추가하여 선택적으로 이 URL의 자격을 부여할 수 있습니다. Apache DS의 기본 포트는 Microsoft AD의 경우10389이며 기본값은389입니다. connectionUsername-
디렉터리 서버에 대한 연결을 여는 사용자의 고유 이름(DN)입니다. 예:
uid=admin,ou=system. 일반적으로 디렉터리 서버는 연결을 열기 위해 클라이언트가 사용자 이름/암호 자격 증명을 제공해야 합니다. connectionPassword-
connectionUsername의 DN과 일치하는 암호입니다. 디렉터리 서버의 DIT( Directory Information Tree )에서 암호는 일반적으로 해당 디렉터리 항목에userPassword속성으로 저장됩니다. connectionProtocol- 모든 값은 지원되지만 효과적으로 사용되지 않습니다. 이 옵션은 기본값이 없기 때문에 명시적으로 설정해야 합니다.
connectionTimeout브로커가 디렉터리 서버에 연결하는 데 사용할 수 있는 최대 시간(밀리초)을 지정합니다. 브로커가 이 시간 내에 디렉터리 서버에 연결할 수 없는 경우 연결 시도를 중단합니다. 이 속성에 대해 0 이하의 값을 지정하면 기본 TCP 프로토콜의 시간 초과 값이 대신 사용됩니다. 값을 지정하지 않으면 브로커는 연결을 설정하기 위해 무기한 대기하거나 기본 네트워크 시간이 초과됩니다.
연결에 대한 연결 풀링이 요청되면 이 속성은 최대 풀 크기에 이미 도달하고 풀의 모든 연결이 사용 중인 경우 브로커가 연결을 대기하는 최대 시간을 지정합니다. 값을 0 이하로 지정하면 브로커가 연결을 사용할 수 있을 때까지 무기한 대기합니다. 그렇지 않으면 최대 대기 시간에 도달하면 브로커가 연결 시도를 중단합니다.
인증-
LDAP 서버에 바인딩할 때 사용되는 인증 방법을 지정합니다. 이 매개변수는
단순(사용자 이름 및 암호 필요) 또는없음(비명 액세스 허용)으로 설정할 수 있습니다. userBase-
사용자 항목을 검색하려면 DIT의 특정 하위 트리를 선택합니다. 하위 트리는 하위 트리의 기본 노드를 지정하는 DN에 의해 지정됩니다. 예를 들어 이 옵션을
로 설정하면 사용자 항목을 검색하면 ou=User,ou=ActiveMQ,ou=system 노드 아래에 있는 하위 트리로 제한됩니다.ou=User,ou=ActiveMQ,ou=system userSearchMatching-
userBase에서 선택한 하위 트리에 적용되는 LDAP 검색 필터를 지정합니다. 자세한 내용은 아래 5.4.1.1절. “일치하는 매개변수 검색” 섹션을 참조하십시오. userSearchSubtree-
userBase에 지정된 노드를 기준으로 사용자 항목에 대한 검색 깊이를 지정합니다. 이 옵션은 부울입니다.false값을 지정하면 검색이userBase노드의 하위 항목 중 하나(Javax.naming.directory.SearchControls.ONELEVEL_SCOPE에 매핑) 중 하나와 일치하려고 한다는 의미입니다.true값을 지정하면 검색이userBase노드의 하위 트리에 속하는 모든 항목을 찾습니다(Javax.naming.directory.SearchControls.SUBTREE_SCOPE). userRoleName- 사용자의 역할 이름 목록이 포함된 사용자 항목의 속성 이름입니다. 역할 이름은 브로커의 권한 부여 플러그인에서 그룹 이름으로 해석됩니다. 이 옵션을 생략하면 사용자 항목에서 역할 이름을 추출하지 않습니다.
readTimeout- 브로커가 디렉터리 서버에서 LDAP 요청으로 응답을 수신하기 위해 대기할 수 있는 최대 시간(밀리초)을 지정합니다. 브로커가 현재 디렉터리 서버에서 응답을 받지 못하면 브로커가 요청을 중단합니다. 값을 0 이하로 지정하거나 값을 지정하지 않으면 브로커는 디렉터리 서버에서 LDAP 요청으로의 응답을 무기한 대기합니다.
roleBase-
역할 데이터가 디렉터리 서버에 직접 저장되는 경우 역할 옵션(
roleBase,roleSearchMatching,roleSearchSubtree및roleName)의 조합으로userRoleName옵션을 지정하는 대안 (또는 그 외에)을 사용할 수 있습니다. 이 옵션은 역할/그룹 항목을 검색할 DIT의 특정 하위 트리를 선택합니다. 하위 트리는 하위 트리의 기본 노드를 지정하는 DN에 의해 지정됩니다. 예를 들어 이 옵션을로 설정하면 role/group 항목이 ou=Group,ou=ActiveMQ,ou=system 노드 아래에 있는 하위 트리로 제한됩니다.ou=Group,ou=ActiveMQ,ou=system roleName- role/group(예: C, O, OU 등)의 이름을 포함하는 역할 항목의 속성 유형입니다. 이 옵션을 생략하면 역할 검색 기능이 효과적으로 비활성화됩니다.
roleSearchMatching-
roleBase에서 선택한 하위 트리에 적용되는 LDAP 검색 필터를 지정합니다. 자세한 내용은 아래 5.4.1.1절. “일치하는 매개변수 검색” 섹션을 참조하십시오. roleSearchSubtreeroleBase에서 지정한 노드를 기준으로 역할 항목을 검색 깊이를 지정합니다.false(기본값)로 설정하면 검색이roleBase노드의 하위 항목 중 하나(Javax.naming.directory.SearchControls.ONELEVEL_SCOPE에 매핑) 중 하나와 일치하려고 합니다.true인 경우 roleBase 노드의 하위 트리에 속하는 모든 항목을 찾습니다(javax.naming.directory.SearchControls.SUBTREE_SCOPE).참고Apache DS는 DN 경로의
OID부분을 사용합니다. Microsoft Active Directory는CN부분을 사용합니다. 예를 들어 Apache DS에서는oid=ECDHE,dc=example,dc=com과 같은 DN 경로를 사용할 수 있지만 Microsoft Active Directory에서cn=ECDHE,dc=example,dc=com과 같은 DN 경로를 사용할 수 있습니다.
- 브로커를 시작하거나 다시 시작합니다(서비스 또는 프로세스).
5.4.1.1. 일치하는 매개변수 검색 링크 복사링크가 클립보드에 복사되었습니다!
userSearchMatchingLDAP 검색 작업에 전달하기 전에 이 구성 매개변수에 제공된 문자열 값에는
java.text.MessageFormat클래스에서 구현한 대로 문자열 대체가 적용됩니다.
즉, 특수 문자열
{0},은 들어오는 클라이언트 자격 증명에서 추출된 대로 사용자 이름으로 대체됩니다. 대체 후에는 문자열이 LDAP 검색 필터로 해석됩니다( syntax는 IETF 표준 RFC 2254에 의해 정의됨).
예를 들어 이 옵션이
(uid={0})로 설정되고 수신된 사용자 이름이jdoe인 경우 문자열 대체 후 검색 필터는(uid=jdoe)가 됩니다.
생성된 검색 필터가 사용자 base,
ou=User,ou=ActiveMQ,ou=system에서 선택한 하위 트리에 적용되는 경우uid=jdoe,ou=User,ou=ActiveMQ,ou=system와 일치합니다.
roleSearchMatching이는 두 개의 대체 문자열을 지원하는 경우를 제외하고
userSearchMatching옵션과 유사한 방식으로 작동합니다.
대체 문자열
{0}은 일치하는 사용자 항목의 전체 DN을 대체합니다(즉, 사용자 검색 결과). 예를 들어 사용자jdoe의 경우 대체 문자열은uid=jdoe,ou=User,ou=ActiveMQ,ou=system일 수 있습니다.
대체 문자열(
{1})은 수신된 사용자 이름을 대체합니다. 예를 들면jdoe입니다.
이 옵션이
(member=uid={1})로 설정되고 수신된 사용자 이름이jdoe인 경우 문자열 대체(ApacheDS 검색 필터 구문 가정) 이후 검색 필터는(member=uid=jdoe)가 됩니다.
결과 검색 필터가 역할 base,
ou=Group,ou=ActiveMQ,ou=system에서 선택한 하위 트리에 적용되는 경우uid=jdoe(구성멤버특성의 값이 DN임)와 같은멤버특성이 있는 모든 역할 항목과 일치합니다.
역할 검색에 기본값이 없으므로 이 옵션을 항상 설정해야 합니다. OpenLDAP를 사용하는 경우 검색 필터의 구문은
(member:=uid=jdoe)입니다.
추가 리소스
- 검색 필터 구문에 대한 간략한 소개는 Oracle JNDI 튜토리얼을 참조하십시오.
5.4.2. LDAP 권한 부여 구성 링크 복사링크가 클립보드에 복사되었습니다!
LegacyLDAPSecuritySettingPlugin 보안 설정 플러그인은 이전에 AMQ 6에서 LDAPAuthorizationMap 및 cachedLDAPAuthorizationMap 으로 이전에 처리한 보안 정보를 읽고 이 정보를 가능한 경우 AMQ 7 보안 설정으로 변환합니다.
AMQ 6 및 AMQ 7의 브로커에 대한 보안 구현이 정확히 일치하지 않습니다. 따라서 플러그인은 두 버전 간 일부 변환을 수행하여 거의 동등한 기능을 달성합니다.
다음 예제에서는 플러그인을 구성하는 방법을 보여줍니다.
절차
-
<
;broker_instance_dir> /etc/broker.xml구성 파일을 엽니다. security-settings요소 내에서security-setting-plugin요소를 추가합니다. 예를 들면 다음과 같습니다.<security-settings> <security-setting-plugin class-name="org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin"> <setting name="initialContextFactory" value="com.sun.jndi.ldap.LdapCtxFactory"/> <setting name="connectionURL" value="ldap://localhost:1024"/>`ou=destinations,o=ActiveMQ,ou=system` <setting name="connectionUsername" value="uid=admin,ou=system"/> <setting name="connectionPassword" value="secret"/> <setting name="connectionProtocol" value="s"/> <setting name="authentication" value="simple"/> </security-setting-plugin> </security-settings>class-name-
구현은
org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin입니다. initialContextFactory-
LDAP에 연결하는 데 사용되는 초기 컨텍스트 팩토리입니다. 항상
com.sun.jndi.ldap.LdapCtxFactory(즉, 기본값)로 설정해야 합니다. connectionURL-
LDAP URL <ldap://Host:Port>을 사용하여 디렉터리 서버의 위치를 지정합니다. 디렉터리 트리에 특정 노드의 고유 이름(DN) 뒤에 슬래시(
/)를 추가하여 선택적으로 이 URL의 자격을 부여할 수 있습니다. 예:ldap://ldapserver:10389/ou=system. 기본값은ldap://localhost:1024입니다. connectionUsername-
디렉터리 서버에 대한 연결을 여는 사용자의 DN입니다. 예:
uid=admin,ou=system. 일반적으로 디렉터리 서버는 연결을 열기 위해 클라이언트가 사용자 이름/암호 자격 증명을 제공해야 합니다. connectionPassword-
connectionUsername의 DN과 일치하는 암호입니다. 디렉터리 서버의 DIT( Directory Information Tree )에서 암호는 일반적으로 해당 디렉터리 항목에userPassword속성으로 저장됩니다. connectionProtocol- 현재 사용되지 않습니다. 나중에 이 옵션을 사용하면 디렉터리 서버에 연결할 SSL(Secure Socket Layer)을 선택할 수 있습니다. 이 옵션은 기본값이 없기 때문에 명시적으로 설정해야 합니다.
인증LDAP 서버에 바인딩할 때 사용되는 인증 방법을 지정합니다. 이 매개변수의 유효한 값은
단순(사용자 이름 및 암호) 또는none(익명)입니다. 기본값은simple입니다.참고SASL(Simple Authentication and Security Layer) 인증은 지원되지 않습니다.
이전 구성 예에 표시되지 않는 다른 설정은 다음과 같습니다.
destinationBase-
자식이 모든 대상에 대한 권한을 제공하는 노드의 DN을 지정합니다. 이 경우 DN은 리터럴 값(즉, 속성 값에서 문자열 대체가 수행되지 않음)입니다. 예를 들어 이 속성의 일반적인 값은
ou=destinations,o=ActiveMQ,ou=system이며 기본값은ou=destinations,o=ActiveMQ,ou=system입니다. filter-
모든 종류의 대상에 대한 권한을 찾을 때 사용되는 LDAP 검색 필터를 지정합니다. 검색 필터는 큐 또는 주제 노드의 하위 또는 하위 항목 중 하나를 일치시킵니다. 기본값은
(cn=*)입니다. roleAttribute-
역할의 DN 값인
filter로 일치하는 노드의 속성을 지정합니다. 기본값은uniqueMember입니다. adminPermissionValue-
관리자권한과 일치하는 값을 지정합니다. 기본값은admin입니다. readPermissionValue-
읽기권한과 일치하는 값을 지정합니다. 기본값은read입니다. writePermissionValue-
쓰기권한과 일치하는 값을 지정합니다. 기본값은write입니다. enableListener-
LDAP 서버에서 자동으로 업데이트를 수신하고 브로커의 권한 부여 구성을 실시간으로 업데이트하는 리스너를 활성화할지 여부를 지정합니다. 기본값은
true입니다. mapAdminToManage레거시(즉, AMQ 6)
관리자권한을 AMQ 7관리권한에 매핑할지 여부를 지정합니다. 아래 표의 매핑 의미에 대한 세부 정보를 참조하십시오. 기본값은false입니다.LDAP에 정의된 대기열 또는 주제의 이름은 보안 설정의 "match" 역할을 하며, 권한 값은 AMQ 6 유형에서 AMQ 7 유형으로 매핑되며, 역할은 그대로 매핑됩니다. LDAP에 정의된 대기열 또는 주제 이름은 보안 설정에 대한 일치 항목으로 사용되므로 보안 설정이 JMS 대상에 예상대로 적용되지 않을 수 있습니다. AMQ 7은 필요에 따라 항상 "jms.queue" 또는 "jms.topic"로 JMS 대상 앞에 있기 때문입니다.
AMQ 6에는
읽기,쓰기및관리자의 세 가지 권한 유형이 있습니다. 이러한 권한 유형은 ActiveMQ 웹 사이트; 보안에 설명되어 있습니다.AMQ 7에는 다음과 같은 권한 유형이 있습니다.
-
createAddress -
deleteAddress -
createDurableQueue -
deleteDurableQueue -
createNonDurableQueue -
deleteNonDurableQueue -
send -
consume -
관리 찾아보기이 표는 보안 설정 플러그인에서 AMQ 6 권한 유형을 AMQ 7 권한 유형으로 매핑하는 방법을 보여줍니다.
Expand AMQ 6 권한 유형 AMQ 7 권한 유형 read
사용, 찾아보기
write
send
admin
createAddress, deleteAddress, createDurableQueue, deleteDurableQueue, createNonDurableQueue, deleteNonDurableQueue, manage (
mapAdminToManage가true로 설정된 경우)아래 설명과 같이 플러그인에서 동등성을 달성하기 위해 AMQ 6 및 AMQ 7 권한 유형 간에 일부 변환을 수행하는 몇 가지 사례가 있습니다.
-
AMQ 6에는 유사한 권한 유형이 없기 때문에 기본적으로 매핑에 AMQ 7
관리권한 유형이 포함되지 않습니다. 그러나mapAdminToManage가true로 설정된 경우 플러그인은 AMQ 6admin권한을 AMQ 7관리권한에 매핑합니다. -
AMQ 6의
admin권한 유형은 대상이 존재하지 않고 사용자가 메시지를 보내는 경우 브로커가 자동으로 대상을 생성하는지 여부를 결정합니다. AMQ 7을 사용하면 사용자가 대상에 메시지를 보낼 수 있는 권한이 있는 경우 자동으로 대상을 자동으로 생성할 수 있습니다. 따라서 플러그인은 레거시관리자권한을 위에 표시된 AMQ 7 권한에 매핑합니다.mapAdminToManage가true로 설정된 경우 플러그인은 AMQ 6admin권한을 AMQ 7관리권한에 매핑합니다.
-
AMQ 6에는 유사한 권한 유형이 없기 때문에 기본적으로 매핑에 AMQ 7
-
5.4.3. login.config 파일에서 암호 암호화 링크 복사링크가 클립보드에 복사되었습니다!
조직에서는 LDAP를 사용하여 데이터를 안전하게 저장하므로 login.config 파일에는 브로커가 조직의 LDAP 서버와 통신하는 데 필요한 구성이 포함될 수 있습니다. 이 설정 파일에는 일반적으로 LDAP 서버에 로그인할 수 있는 암호가 포함되어 있으므로 이 암호를 암호화해야 합니다.
사전 요구 사항
-
5.4.2절. “LDAP 권한 부여 구성” 에 설명된 대로
login.config파일을 수정하여 필요한 속성을 추가했는지 확인합니다.
절차
다음 절차에서는 < broker_instance_dir> /etc/login.config 파일에 있는 connectionPassword 매개 변수 값을 마스킹하는 방법을 보여줍니다.
명령 프롬프트에서
mask유틸리티를 사용하여 암호를 암호화합니다.$ <broker_instance_dir>/bin/artemis mask <password>result: 3a34fd21b82bf2a822fa49a8d8fa115d<
broker_instance_dir>/etc/login.config파일을 엽니다.connectionPassword매개변수를 찾습니다.connectionPassword = <password>일반 텍스트 암호를 암호화된 값으로 바꿉니다.
connectionPassword = 3a34fd21b82bf2a822fa49a8d8fa115d암호화된 값을
"ENC()"식별자로 래핑합니다.connectionPassword = "ENC(3a34fd21b82bf2a822fa49a8d8fa115d)"
login.config 파일에 마스크된 암호가 포함되어 있습니다. 암호가 "ENC()" 식별자로 래핑되므로 AMQ Broker는 사용하기 전에 암호를 해독합니다.
추가 리소스
- AMQ Broker에 포함된 구성 파일에 대한 자세한 내용은 AMQ Broker 구성 파일 및 위치를 참조하십시오.