티스토리 뷰

AWS

[AWS] LDAP

Jane Kwon 2021. 2. 10. 11:03
반응형

 

  • LDAP (Lightweight Directory Access Protocol)
    - 네트워크 상에서 조직이나 개인정보 혹은 파일이나 디바이스 정보 등을 찾아 보는 것을
       가능하게 만든 소프트웨어 프로토콜로, LDAP 은 네트워크 상의 디렉터리 서비스 표준인 X.500 의
       DAP(Directory Access Protocol) 를 기반으로 한 경량화된 DAP 버전

 

X.500 의 DAP 는 OSI 전체 프로토콜 스택을 지원하며
운영에 매우 많은 컴퓨팅 자원을 필요로 하는 아주 무거운 프로토콜인데,
이런 DAP 의 복잡성을 줄이기 위해 만들어진 LDAP 은 TCP/IP 레벨에서 더 적은 비용으로
DAP 의 많은 기능적인 부분을 조작할 수 있도록 설계되었고,
초창기에는 X.500 의 DAP 를 액세스하기 위한 게이트웨이로 많이 쓰였다고 하는데
최근엔 X.500 DAP 보다 더 일반적인 디렉터리 서비스를 추축하기 위해 사용되고 있다.

 

 

그럼 LDAP 은 어떤 경우에 사용하는게 좋을까?

  • 유저 권한 관리
  • 주소록
  • 조직도
  • 사용자 정보 관리
  • 애플리케이션/시스템 설정 정보
  • 공개 키 인프라스트럭쳐
  • DHCP, DNS 등의 저장소
  • 문서 관리
  • 이미지 저장소
  • Code

위에서의 예시와 같이 중앙관리가 필요하고 검색에 최적화된 서비스 용도라면 다른 어떤 경우라도 사용 가능하다.

 

 

Directory 서비스를 위한 LDAP 서버를 구축하기 위해서는,
Windows Server 라이센스가 있다면 Active Directory 를 사용하면 되고,
오픈 소스 중에서도 OpenLDAP 과 Apache DS, OpenDJ, 389 Directory Server 가 가장 많이 사용된다.

 

 

 

FreeIPA

freeipa 컨테이너 실행

$ docker run --name freeipa -ti   --cap-add NET_ADMIN   --sysctl net.ipv6.conf.all.disable_ipv6=0   -v /dev/urandom:/dev/random:ro   -v /sys/fs/cgroup:/sys/fs/cgroup:ro   -v /home/jane/data/freeipa:/data:Z   -h ldap.gyurida.shop   -p 9443:443 -p 9389:389 -p 9636:636   -e PASSWORD=jane_2020 -e DEBUG_NO_EXIT=1   freeipa/freeipa-server:centos-8 -r GYURIDA.SHOP   -U --admin-password=jane_2020 --ds-password=jane_2020

load balancer 에 389 포트를 9389 포트로 넘겨주는 설정 추가

 

nginx.conf 에 9389 포트로 들어오는 트래픽에 대해 ldap 으로 넘겨주기 위한 stream 설정 변경 후 service nginx reload

 

nginx 는 http 80 포트를 여러 포트로 포워딩하기 위해 사용하는 것이 목적이므로
9389를 9389로 포워딩 해주거나 2224를 2224로 포워딩해주는 것은 무의미하며,
결국 이 문제로 인하여 nginx 에서 포트를 사용하고 있기 때문에 docker 에서 해당 포트에 대한 에러가 발생한다.
([Docker] docker 재실행시 address already in use 에러 해결)

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

stream {
        upstream ldap {
                server localhost:9389;
        }
        server {
                listen 9389;
                proxy_pass ldap;
        }
        upstream gitlab {
                server localhost:2224;
        }
        server {
                listen 2224;
                proxy_pass gitlab;
        }

}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

sites-available 폴더에 ldap 하위 도메인에 대한 configure 파일을 제작

server {
   listen 80;

   server_name ldap.gyurida.shop;

   if ($http_x_forwarded_proto = 'http') {
      return 301 https://$host$request_uri;
   }

   location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      proxy_pass https://localhost:9443;
      proxy_redirect off;
   }
}

 

 

 

Gitlab 에 LDAP 연동

LDAP 연동을 위한 Gitlab docker-compose.yml 파일 수정 후 다시 docker-compose up

version: '3'

services:
  gitlab:
    image: 'gitlab/gitlab-ee:12.8.1-ee.0'
    restart: always
    hostname: 'gitlab.gyurida.shop'
    container_name: gitlab
    environment:
      TZ: 'Asia/Seoul'
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.gyurida.shop'
        letsencrypt['enable'] = false
        nginx['redirect_http_to_https'] = false
        nginx['listen_https'] = false
        nginx['listen_port'] = 8929
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
        gitlab_rails['ldap_enabled'] = true
        gitlab_rails['prevent_ldap_sign_in'] = false
        gitlab_rails['ldap_servers'] = YAML.load <<-EOS
        main:
          label: 'LDAP'
          host: 'ldap.gyurida.shop'
          port: 389
          uid: 'uid'
          method: 'plain'
          bind_dn: 'uid=jane,cn=users,cn=accounts,dc=gyurida,dc=shop'
          password: 'jane_2020'
          encryption: 'plain'
          active_directory: true
          allow_username_or_email_login: true
          base: 'cn=accounts,dc=gyurida,dc=shop'
          verify_certificates: false
          attributes:
            username: ['uid']
            email: ['mail']
            name: 'displayName'
            first_name: 'givenName'
            last_name: 'sn'
        EOS
    ports:
      - '8929:8929'
      - '2224:22'
    volumes:
      - '/home/jane/conf/gitlab:/etc/gitlab'
      - '/home/jane/log/gitlab:/var/log/gitlab'
      - '/home/jane/data/gitlab:/var/opt/gitlab'

 

 

 

Jenkins 에 LDAP 연동

Admin 계정으로 로그인 후

  1. Jenkins 관리
  2. Configure Global Security
    • Security Realm : LDAP 체크
    • 서버
      1. Server : ldap.gyurida.shop
      2. root DN : dc=gyurida,dc=shop
      3. User search base : cn=users,cn=accounts
      4. User search filter : uid={0}
      5. Group search base : cn=groups,cn=accounts
      6. Group membership
        1. Parse user attribute for list of LDAP groups 체크
        2. Group membership attribute : memberOf
      7. Manager DN : uid=jane,cn=users,cn=compat,dc=gyurida,dc=shop (LDAP 에 등록된 임의의 사용자 아이디)
      8. Manager Password : jane_2020 (LDAP 에 등록된 임의의 사용자 비밀번호)
      9. Display Name LDAP attribute : displayname
      10. Email Address LDAP attribute : mail
  3. Test
  4. Save

 

 

 

Redmine 에 LDAP 연동

Admin 계정으로 로그인 후

  1. 관리
  2. LDAP 인증
  3. 새 인증 공급자
    1. 이름 : ldap (관리용 이름)
    2. 호스트 : ldap.gyurida.shop
    3. 포트 : 389 / LDAP
    4. 계정 : uid=jane,cn=users,cn=compat,dc=gyurida,dc=shop (LDAP 에 등록된 임의의 사용자 아이디)
    5. 비밀번호 : jane_2020 (LDAP 에 등록된 임의의 사용자 비밀번호)
    6. 기본 DN : cn=users,cn=accounts,dc=gyurida,dc=shop
    7. 타임아웃 (초) : 5
    8. 동적 사용자 생성 체크 (LDAP 계정으로 첫 로그인시 자동으로 Redmine 사용자로 추가)
    9. 로그인 속성 : uid
    10. 이름 속성 :givenName
    11. 성 속성 : sn
    12. 메일 속성 : mail
  4. 저장
  5. 테스트

 

 

 

Nexus 에 LDAP 연동

Admin 계정으로 로그인 후

  1. Server Administration and Configuration
  2. Security - LDAP
  3. Connection 탭 선택
    1. Name : ldap (관리용 이름)
    2. LDAP server address : ldap / ldap.gyurida.shop
    3. Search base DN : cn=users,cn=accounts,dc=gyurida,dc=shop
    4. Authentication method : Simple Authentication
    5. Username or DN : uid=jane,cn=users,cn=compat,dc=gyurida,dc=shop (LDAP 에 등록된 임의의 사용자 아이디)
    6. Password : jane_2020 (LDAP 에 등록된 임의의 사용자 비밀번호)
    7. Connection rules : Wait 30 seconds before timeout. Retry after 300 seconds, max of 3 failed attempts.
  4. Save
  5. User and group 탭 선택
    1. Object class : inetOrgPerson
    2. User ID attribute : uid
    3. Real name attribute : cn
    4. Email attribute : mail
    5. Map LDAP groups as roles 체크
    6. Group type : Dynamic Groups
    7. Group member of attribute : memberOf
  6. Save
  7. Verify connection

 

 

 

VPN 에 LDAP 연동

* Softether VPN 의 경우 직접적인 LDAP 인증을 지원하지 않아 radius 를 통해 LDAP 인증을 받아야 하므로
LDAP 컨테이너가 실행 중인 인스턴스에 freeradius 를 설치하여 이용

 

freeradius 설치

$ sudo -i
# apt install -y freeradius freeradius-ldap freeradius-config freeradius-utils freeradius-krb5
# /etc/freeradius/3.0/mods-enabled
# ln -s ../mods-available/ldap ./

패키지를 설치 후 설정

# vi /etc/freeradius/3.0/mods-enabled/ldap
server = 'ldap.gyurida.shop'
port = 389
identity = 'uid=jane,cn=users,cn=compat,dc=gyurida,dc=shop'
password = 'jane_2020'
base_dn = 'cn=users,cn=accounts,dc=gyurida,dc=shop'
# vi /etc/freeradius/3.0/clients.conf
client localhost {

.
.
.

        ipaddr = *
        secret = 12345678

.
.
.

}

client localhost_ipv6 {
        ipv6addr        = ::1
        secret          = 12345678
}
# vi /etc/freeradius/3.0/sites-enabled/default
ldap
if ((ok || updated) && User-Password) {
    update {
        control:Auth-Type := ldap
    }
}

.
.
.

authenticate
Auth-Type LDAP {
    ldap
}

 

마지막 /etc/freeradius/3.0/sites-enabled/default 의 authenticate 블록 아래 내용은 없으면 추가한다.

 

설정 완료 후 설정 반영

# service freeradius restart

LDAP 과 연결되었는지 확인

# radtest jane jane_2020 127.0.0.1 1812 12345678
Sent Access-Request Id 65 from 0.0.0.0:42635 to 127.0.0.1:1812 length 75
	User-Name = "jane"
	User-Password = "jane_2020"
	NAS-IP-Address = 172.31.41.233
	NAS-Port = 1812
	Message-Authenticator = 0x00
	Cleartext-Password = "jane_2020"
Received Access-Accept Id 65 from 127.0.0.1:1812 to 0.0.0.0:0 length 20

 

* Softether VPN 에서 radius 를 사용할 수 있도록 다음과 같이 설정

 

 

 

 

 

반응형

'AWS' 카테고리의 다른 글

[AWS] ECS 올리기 - 1. VPC  (0) 2022.03.25
[AWS] CodeCommit 소스 다운로드  (0) 2021.02.16
[AWS] VPN 설치  (0) 2021.02.10
[AWS] Certificate Manager 에서 SSL 인증서 발급  (0) 2021.02.09
[AWS] Route 53 을 활용한 도메인 연결  (0) 2021.02.09
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함