티스토리 뷰

반응형

개요

사용자 계정을 Wazuh Internal User 기능으로 생성할 수 있지만,

패스워드를 잊었다는 문의가 많아서 AD 연동을 하게 되었다.

수행한 내용을 순차적으로 기록해둔다.

가이드는 https://documentation.wazuh.com/current/user-manual/user-administration/ldap.html 를 참고했다.

관련 내용은 외쿡 말로는 AD(LDAP) integration이라고 검색하면 된다.

 

 

수행내용

1. AD 서버 서비스 계정 생성

일반 AD 사용자가 아닌 서비스 계정을 만들어서 AD 서버에 인증하는 것이 적절한 방식일 것이다.

CN이 wazuh인 계정을 생성받았다.

 

 

2. 방화벽 오픈

AD 로그인은 Wazuh indexer에서 수행하므로 인덱서의 IP <-> AD 서버와의 통신이 이루어져야 한다.

LDAP의 경우 389 port를, LDAPS인 경우 636 port를 오픈해야 한다.

 

 

3. Wazuh indexer config 수정 ⭐

Wazuh indexer의 config 수정 경로는 /etc/wazuh-indexer/opensearch-security/config.yml이다.

3-1. authc

authc 단락은 AD 계정의 Authentication(인증, 로그인)을 설정하는 부분이다.

default에서 설정을 변경해야 하는 부분(중점적으로 확인할 부분)에 노란색 사각형 표시를 주었다.

authc: // User AD계정 Authentication 설정
    ldap:
        description: "Authenticate via LDAP or Active Directory"
        http_enabled: true 🟨
        transport_enabled: false
        order: 4
        http_authenticator:
          ...
        authentication_backend:
          type: ldap
          config:
            ...
            hosts:
              - [AD_SERVER_IP]:389 🟨
            bind_dn: CN=wazuh,OU=[OU],DC=[DC] 🟨
            password: 🟨
            userbase: 'OU=[OU],DC=[DC],DC=[DC]' // User를 찾을 기준 🟨
            usersearch: '(sAMAccountName={0})' 🟨
            username_attribute: sAMAccountName 🟨

(1) http_enabled : Wazuh 대시보드에 SSL 인증서가 적용되지 않은 경우 true로 설정해야 한다.

(2) hosts : 연동할 AD(LDAP) 서버의 IP와 포트를 작성한다.

(3) bind_dn : 1번에서 생성한 AD 서비스 계정이다.

(4) password : AD 서비스 계정의 패스워드이다.

(5) userbase : 사용자를 찾을 DN이다. 예를 들어 인사 부서의 사용자만 로그인하게 하고 싶다면, OU=HR,DC=tistory,DC=com처럼 작성하면 된다.

(6) usersearch : Wazuh에 로그인을 시도할 때 실행할 쿼리이다.

(7) username_attribute : 로그인하는 사용자 이름을 찾을 AD 속성이다. (ex. soya) 

회사마다 AD 구성이 다르므로 usersearch와 username_attribute에 CN을 사용할 수도 있다. 

3-2. authz

authz 단락은 AD 계정의 Authorization(인가, 역할)을 설정하는 부분이다.

default에서 설정을 변경해야 하는 부분(중점적으로 확인할 부분)에 보라색 사각형 표시를 주었다.

authz: // User AD계정 Authorization 설정
      roles_from_myldap:
        authorization_backend:
          type: ldap
          config:
            hosts:
              - [AD_SERVER_IP]:389 🟪
            bind_dn: CN=wazuh,OU=[OU],DC=[DC] 🟪
            password: 🟪
            rolebase: [rolesearch의 기준이 될 DN] 🟪
            rolesearch: '(member={0})' // member의 CN 확인 🟪
            userroleattribute: null
            userrolename: memberOf
            rolename: cn 🟪
            resolve_nested_roles: false
            userbase: 'OU=[OU],DC=[DC],DC=[DC]' 🟪
            usersearch: '(sAMAccountName={0})' 🟪

hosts와 bind_dn, password는 authc와 동일하게 설정한다.

AD에는 memberOf라는 사용자 객체 속성이 있다. 만약 soya의 memberOf 속성 value가 다음과 같다고 하자.

CN=soya (memberOf: CN=Secu-Tech.team,OU=Group,DC=DC...)

(1) rolebase : 역할을 search(query)할 DN의 하위 트리를 설정한다. 만약 보안팀인 경우만 Role을 부여하고 싶다면 위의 memberOf 예시 중 OU=Group,DC=DC 부분을 base로 설정한다.

(2) rolesearch : 위 rolebase를 수행할 AD 속성이다. 즉 여기서 (member={0})으로 했으면, OU=Group,DC=DC를 가진 모든 사용자의 role을 찾는다.

(3) rolename : Wazuh에서 role을 mapping할 때 사용할 Backend role User명이다. 예를 들어 Backend role에 User를 Secu-Tech.team으로 한다면 이 부분은 CN으로 설정해야 한다. (CN=Secu-Tech.team이므로)

(4) userbase 및 usersearch : authc와 동일하게 설정한다.

 

😅 뭔가 설명을 적으려니 굉장히 정리가 어렵다.

결론은 Backend role에 User명을 매핑할 부분이 CN이 되어야 하고, rolebase는 그 CN 하위의 DN이 되어야 한다.

어떤 것을 role 구분의 기준으로 잡느냐에 따라 위의 모든 설정 값들은 아예 달라진다.

 

 

4. Backend user role mapping ⭐

4-1. 이미 존재하는 Role에 매핑

만약 reserved된(대시보드에서 수정이 불가한) role에 역할을 부여하려면 

/etc/wazuh-indexer/opensearch-security/roles_mapping.yml 파일에

아래처럼 backend_roles에 구분되는 CN 등을 작성하고 저장한다.

all_access:
  ...
  backend_roles:
  - "Secu-Tech.team"
  ...
...

4-2. Custom Role 생성

대시보드의 Security > Roles > Mapped users에서 아래와 같이 User에 CN을 작성하고 저장해준다. 

⛔ 읽기 전용(readonly) 사용자의 Permissions 경우

Cluster permissions를 cluster_composite_ops_ro로, Index permissions는 * read로, global_tenant Read only를 부여한다.

 

5. 수정사항 반영

Wazuh indexer 서버에서 수행해주면 된다.

사실 이거 왜 해줘야 하는지 많이 알아봤지만 아직까지 모르겠다.

아시는 분 있으면 공유 좀 부탁드려요..

export JAVA_HOME=/usr/share/wazuh-indexer/jdk/ && bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh -f /etc/wazuh-indexer/opensearch-security/config.yml -icl -key /etc/wazuh-indexer/certs/admin-key.pem -cert /etc/wazuh-indexer/certs/admin.pem -cacert /etc/wazuh-indexer/certs/root-ca.pem -h [WAZUH_INDEXER_IP] -nhnv
export JAVA_HOME=/usr/share/wazuh-indexer/jdk/ && bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh -f /etc/wazuh-indexer/opensearch-security/roles_mapping.yml -icl -key /etc/wazuh-indexer/certs/admin-key.pem -cert /etc/wazuh-indexer/certs/admin.pem -cacert /etc/wazuh-indexer/certs/root-ca.pem -h [WAZUH_INDEXER_IP] -nhnv

 

6. Dashboard 재기동

systemctl restart wazuh-dashboard

 

7. AD 계정으로 로그인 확인

대시보드에서 로그인되는지 확인한다.

최상단 우측의 프로필을 눌러 'View roles and identities'에서 부여된 역할을 볼 수 있다.

기본 admin role인 all_access가 부여되었다.

위처럼 authz 및 roles_mapping.yml 설정을 한다면,

사용자의 memberOf 속성값이 CN:Secu-Tech.team인 경우 Backend role이 Secu-Tech.team이 되고,

all_access role이 최종적으로 부여되어 admin이 되는 방식이다.

 

AD 구조를 아직까지 완벽하게 파악하진 못했지만 어쨌든 연동은 잘 완료했다.

적용은 했는데 막상 글로 쓰려니 참 어려운 것 같다.

어찌저찌..DN이 뭣이고 Wazuh에선 어떻게 해야되는지 yml 설정만 한 40번은 바꿔보면서 테스트해봤다.

Wazuh 하면서 해보고 싶었던 중에 AD 연동이 제일 엄청 어려웠다. 

다음엔 웹 진단 좀 끝나면 CVE쪽 고도화 해봐야징~

CN이 차이나로 보였던 건 안 비밀. 끝!!

반응형
댓글
반응형
Recent Post.
Recent Reply.
Thanks for comming.
오늘은
명이 방문했어요
어제는
명이 방문했어요