티스토리 뷰
- 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 계정으로 로그인 후
- Jenkins 관리
- Configure Global Security
-
- Security Realm : LDAP 체크
- 서버
- Server : ldap.gyurida.shop
- root DN : dc=gyurida,dc=shop
- User search base : cn=users,cn=accounts
- User search filter : uid={0}
- Group search base : cn=groups,cn=accounts
- Group membership
- Parse user attribute for list of LDAP groups 체크
- Group membership attribute : memberOf
- Manager DN : uid=jane,cn=users,cn=compat,dc=gyurida,dc=shop (LDAP 에 등록된 임의의 사용자 아이디)
- Manager Password : jane_2020 (LDAP 에 등록된 임의의 사용자 비밀번호)
- Display Name LDAP attribute : displayname
- Email Address LDAP attribute : mail
- Test
- Save
Redmine 에 LDAP 연동
Admin 계정으로 로그인 후
- 관리
- LDAP 인증
- 새 인증 공급자
-
- 이름 : ldap (관리용 이름)
- 호스트 : ldap.gyurida.shop
- 포트 : 389 / LDAP
- 계정 : uid=jane,cn=users,cn=compat,dc=gyurida,dc=shop (LDAP 에 등록된 임의의 사용자 아이디)
- 비밀번호 : jane_2020 (LDAP 에 등록된 임의의 사용자 비밀번호)
- 기본 DN : cn=users,cn=accounts,dc=gyurida,dc=shop
- 타임아웃 (초) : 5
- 동적 사용자 생성 체크 (LDAP 계정으로 첫 로그인시 자동으로 Redmine 사용자로 추가)
- 로그인 속성 : uid
- 이름 속성 :givenName
- 성 속성 : sn
- 메일 속성 : mail
- 저장
- 테스트
Nexus 에 LDAP 연동
Admin 계정으로 로그인 후
- Server Administration and Configuration
- Security - LDAP
- Connection 탭 선택
-
- Name : ldap (관리용 이름)
- LDAP server address : ldap / ldap.gyurida.shop
- Search base DN : cn=users,cn=accounts,dc=gyurida,dc=shop
- Authentication method : Simple Authentication
- Username or DN : uid=jane,cn=users,cn=compat,dc=gyurida,dc=shop (LDAP 에 등록된 임의의 사용자 아이디)
- Password : jane_2020 (LDAP 에 등록된 임의의 사용자 비밀번호)
- Connection rules : Wait 30 seconds before timeout. Retry after 300 seconds, max of 3 failed attempts.
- Save
- User and group 탭 선택
-
- Object class : inetOrgPerson
- User ID attribute : uid
- Real name attribute : cn
- Email attribute : mail
- Map LDAP groups as roles 체크
- Group type : Dynamic Groups
- Group member of attribute : memberOf
- Save
- 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 |