728x90
반응형

개요

그룹웨어 DB인 Postgresql에서 User View Table에 임직원이 추가 되거나 부서 이동 하였을 경우

그룹웨어에 먼저 업데이트 되는데 이 데이터를 긁어와서 LDAP에도 자동으로 업데이트 되도록 List를 추출하는 작업이다

Python으로 임직원 목록을 불러오며, 외주직원은 제외하거나, 퇴사한 직원, 전체 부서 리스트 등을 추출 한다.

#-*- coding: euc-kr -*-
import boto3
import json
import psycopg2
import requests
import sys
import chardet

sys.stdout = open('/usr/share/openldap-servers/userList.json', 'w')

try:
    conn_string = "host='gw.testhub.com' dbname='tims' user='test' password='test2164!@' port='5432'"
    conn = psycopg2.connect(conn_string)
    cur = conn.cursor()
    #qry_origin = "select userid, status, username, mailaddr, deptname, updated_at from view_user where updated_at >= current_timestamp + '-240 minute' and deptcode not like 'E%' and order by updated_at desc"
    qry_origin = "select userid, status, username, mailaddr, deptname, updated_at from view_user where deptcode not like 'E%'"
    qry = u"select row_to_json(tmp) from ("+ qry_origin +") tmp;"
    cur.execute(qry)
    rownum = int(cur.rowcount)
    i=0
    while i < rownum:
        result = cur.fetchone()[0]
        print(json.dumps(result, ensure_ascii=False).encode('utf8'))
        i = i + 1
    cur.close()
    conn.close()
except psycopg2.DatabaseError as db_err:
    print('!!! not connected !!!', db_err)

sys.stdout.close()

sys.stdout = open('/usr/share/openldap-servers/userStopList.json', 'w')

try:
    conn_string = "host='gw.testhub.com' dbname='tims' user='test' password='test2164!@' port='5432'"
    conn = psycopg2.connect(conn_string)
    cur = conn.cursor()
    #qry_origin = "select userid, status, username, mailaddr, updated_at from view_user where updated_at >= current_timestamp + '-240 minute' and status='STOP'"
    qry_origin = "select userid, status, username, mailaddr, updated_at from view_user where status='STOP'"
    qry = u"select row_to_json(tmp) from ("+ qry_origin +") tmp;"
    cur.execute(qry)
    rownum = int(cur.rowcount)
    i=0
    while i < rownum:
        result = cur.fetchone()[0]
        print(json.dumps(result, ensure_ascii=False).encode('utf8'))
        i = i + 1
    cur.close()
    conn.close()
except psycopg2.DatabaseError as db_err:
    print('!!! not connected !!!', db_err)

sys.stdout.close()

sys.stdout = open('/usr/share/openldap-servers/gwTotalGroupList.lst', 'w')

try:
    conn_string = "host='gw.testhub.com' dbname='tims' user='test' password='test2164!@' port='5432'"
    conn = psycopg2.connect(conn_string)
    cur = conn.cursor()
    qry_origin = "select distinct deptcode, deptname from view_user where deptcode not like 'E%'"
    qry = u"select row_to_json(tmp) from ("+ qry_origin +") tmp;"
    cur.execute(qry)
    rownum = int(cur.rowcount)
    i=0
    while i < rownum:
        result = cur.fetchone()[0]
        print(json.dumps(result, ensure_ascii=False).encode('utf8'))
        i = i + 1
    cur.close()
    conn.close()
except psycopg2.DatabaseError as db_err:
    print('!!! not connected !!!', db_err)

sys.stdout.close()

Lambda로도 비슷하게 가능하다.

import boto3
import json
import psycopg2 #PostgreSQL 과 연결하려면 반드시 있어야 되는 드라이버 (람다에서는 레이어 붙이는걸로 처리 가능)
import requests

def lambda_handler(event, context):
    
    print('db connect')
    conn = psycopg2.connect(host='gw.testhub.com', dbname='tims', user='test', password='test2164!@', port='5432') #DB 접속 구문 
    print('db connect success!')
    cur = conn.cursor() #커서 생성 (쿼리 칠 때 필요함)
    print('start query')
    
    qry_origin = "select status, empno, username, mailaddr, deptcode, deptname, dutycode, positionname, dutyname, updated_at from view_user where updated_at >= current_timestamp + '-10 minute' and status like 'STOP' and dutyname is null order by updated_at desc"
    qry = "select row_to_json(tmp) from ("+ qry_origin +") tmp;" #쿼리문 (row_to_json으로 바로 JSON 형식으로 뽑아다줌)
    
    cur.execute(qry) #쿼리 실행
    rownum = int(cur.rowcount)  # DB 총 행 개수 구하기
    print(rownum)
    
    i=0
    while i < rownum: #쿼리 결과 값 나온 행 수 만큼 반복해서 
        result = cur.fetchone()[0] #cur.fetchone()로 한 행 결과값 묶어주기 (fetchall() 을 호출하면 전체 행 값이 나옴) ([0] 을 넣어줘야 대괄호나 괄호가 안생김)
        req_url = requests.post('https://intra.testhub.com:7075/RF_COUNT/minsu/insertUsr', json = result) #결과 값 URL 호출
        print(result)
        print(req_url)
        i = i + 1
   

    cur.close()
    conn.close()
728x90
300x250
728x90
반응형

개요

LDAP을 사용 중인 사용자들에게 

보안정책에 따라 패스워드 만료일이 다가오거나 만료가 되었을 때

메일로 알려주는 역할을 한다.

메일 문구는 예씨로 작성 하였다. 자유롭게 변경 가능하다.

MY_LDAP_HOSTURI="ldapi:///"
MY_LDAP_DEFAULTPWDPOLICYDN="cn=default,ou=Policies,cn=manager,dc=test,dc=com"
MY_LDAP_EXCLUDEPWDPOLICYDN="cn=e,cn=default,ou=Policies,cn=manager,dc=test,dc=com"
MY_LDAP_SEARCHBASE="ou=People,dc=test,dc=com"
MY_LDAP_SEARCHFILTER="(&(uid=*)(objectClass=inetOrgPerson))"
MY_LDAP_SEARCHSCOPE="one"
MY_LDAP_SEARCHBIN="/usr/bin/ldapsearch"
#MY_MAIL_DELAY=10
MY_LDAP_NAME_ATTR=cn
MY_LDAP_LOGIN_ATTR=uid
MY_LDAP_MAIL_ATTR=mail
export LC_ALL=ko_KR.UTF-8
MY_MAIL_BODY="
        안녕하세요 %name 님,\n\n \

        귀하의 비밀번호 변경이 필요합니다. \n\n \

        해당 비밀번호는 정보보호 정책에 의해 %expireTimeTZ, %expireDays 일 후 만료 됩니다. \n\n \

        아래 해당 정책에 준수하여 변경 부탁드립니다.:\n\n \

        \t\t - 영문 대소문자/숫자/특수문자 중 3가지 이상 조합, 최소 8자리 이상 \n\n \
        \t\t - 비밀번호 변경 페이지  \n \
        \t\t    http://ssp.ldap.test.com/ \n\n \
        \t\t - 비밀번호 변경 후 공용폴더 사용자들은 Windows 자격증명 변경이 필요합니다. \n\n \
        \t\t - 아래 매뉴얼을 확인 하시어 Windows 자격증명을 변경 하세요.
        \t\t    

        추가로 문의사항은 Infra Part에 문의 바랍니다. \n\n \

        감사합니다."
EX_MAIL_BODY="
        안녕하세요 %name 님,\n\n \

        %name 님의 비밀번호가 %expireTimeTZ 부로 만료 되었습니다. \n\n \

        아래 주소로 접속하셔서 '패스워드 초기화' 를 진행하시기 바랍니다. \n\n \

        \t\t - 비밀번호 초기화 페이지 \n \
        \t\t    http://ssp.ldap.test.com/index.php?action=sendtoken \n\n \
        \t\t - 그룹웨어 메일 확인 필수 \n\n \
        \t\t - 비밀번호 초기화 후 공용폴더 사용자들은 Windows 자격증명 변경이 필요합니다. \n\n \
        \t\t - 아래 매뉴얼을 확인 하시어 Windows 자격증명을 변경 하세요.
        \t\t   

        추가 문의사항 있을 시 Infra Part에 문의 바랍니다. \n\n \

        감사합니다."
MY_MAIL_SUBJECT="[회사] 비밀번호 상태 안내 메일 입니다."
MY_MAIL_BIN="mail"
#MY_LOG_HEADER="`date +\"%b %e,%Y %T\"`"
MY_LOG_HEADER="`TZ='Asia/Seoul' date +\"%Y년 %B %d일 %A %T\"`"
MY_GAWK_BIN="/usr/bin/gawk"
getTimeInSeconds() {
        date=0
        os=`uname -s`
        if [ "$1" ]; then
                #date=`${MY_GAWK_BIN} 'BEGIN  { \
                date=`TZ=UTC ${MY_GAWK_BIN} 'BEGIN  { \
                        if (ARGC == 2) { \
                                print mktime(ARGV[1]) \
                        } \
                        exit 0 }' "$1"`
        else
                if [ "${os}" = "SunOS" ]; then
                        date=`/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= \
                                '/^time\(\)/ {gsub(/ /,"",$2);print $2}'`
                else
                        now=`date +"%Y %m %d %H %M %S" -u`
                        #now=`date +"%Y %m %d %H %M %S"`
                        date=`getTimeInSeconds "$now"`
                fi
        fi
        echo ${date}
}
tmp_dir="/tmp/$$.checkldap.tmp"
result_file="${tmp_dir}/res.tmp.1"
buffer_file="${tmp_dir}/buf.tmp.1"
tmp_dir_stats="/tmp/ldap-password-stats"
ldap_param="-Y EXTERNAL -H ${MY_LDAP_HOSTURI} -LLL -Q"
nb_users=0
nb_expired_users=0
nb_warning_users=0
nb_exclude_users=0
if [ -d ${tmp_dir} ]; then
        echo "Error : temporary directory exists (${tmp_dir})"
        exit 1
fi
mkdir ${tmp_dir}
if [ ${MY_LDAP_ROOTDN} ]; then
        ldap_param="${ldap_param} -D ${MY_LDAP_ROOTDN} -w ${MY_LDAP_ROOTPW}"
fi
${MY_LDAP_SEARCHBIN} ${ldap_param} -s ${MY_LDAP_SEARCHSCOPE} \
        -b "${MY_LDAP_SEARCHBASE}" "${MY_LDAP_SEARCHFILTER}" \
        "dn" > ${result_file}
while read dnStr
do
        if [ ! "${dnStr}" ]; then
                continue
        fi
        dn=`echo ${dnStr} | cut -d : -f 2`
        nb_users=`expr ${nb_users} + 1`
        ${MY_LDAP_SEARCHBIN} ${ldap_param} -s base -b "${dn}" \
                ${MY_LDAP_NAME_ATTR} ${MY_LDAP_LOGIN_ATTR} ${MY_LDAP_MAIL_ATTR} pwdChangedTime pwdPolicySubentry \
                > ${buffer_file}
        login=`grep -w "${MY_LDAP_LOGIN_ATTR}:" ${buffer_file} | cut -d : -f 2 \
                | sed "s/^ *//;s/ *$//"`
        name=`grep -w "${MY_LDAP_NAME_ATTR}:" ${buffer_file} | cut -d : -f 2\
                | sed "s/^ *//;s/ *$//"`
        name2=`echo ${name}`
        mail=`grep -w "${MY_LDAP_MAIL_ATTR}:" ${buffer_file} | cut -d : -f 2 \
                | sed "s/^ *//;s/ *$//"`
        pwdChangedTime=`grep -w "pwdChangedTime:" ${buffer_file} \
                | cut -d : -f 2 | cut -c 1-15 | sed "s/^ *//;s/ *$//"`
        pwdPolicySubentry=`grep -w "pwdPolicySubentry:" ${buffer_file} \
                | cut -d : -f 2 | sed "s/^ *//;s/ *$//"`
        if [ ! "${pwdChangedTime}" ]; then
                echo "${login} (${mail}) 해당 계정은 패스워드 변경 날짜가 존재하지 않습니다." >> ${tmp_dir_stats}
                continue
        fi
        if [ ! "${pwdPolicySubentry}" -a ! "${MY_LDAP_DEFAULTPWDPOLICYDN}" ]; then
                echo "${login} (${mail}) 해당 계정은 패스워드 정책이 걸려있지 않습니다." >> ${tmp_dir_stats}
                continue
        fi
        if [ "${pwdPolicySubentry}" ]; then
                echo "${login} (${mail}) 해당 계정은 패스워드 정책 제외 대상 입니다." >> ${tmp_dir_stats}
                continue
        fi
        ldap_search="${MY_LDAP_SEARCHBIN} ${ldap_param} -s base"
        if [ "${pwdPolicySubentry}" ]; then
                ldap_search="${ldap_search} -b ${pwdPolicySubentry}"
        else
                ldap_search="${ldap_search} -b ${MY_LDAP_DEFAULTPWDPOLICYDN}"
        fi
        ldap_search="$ldap_search pwdMaxAge pwdExpireWarning pwdMinLength pwdInHistory"
        pwdMaxAge=`${ldap_search} | grep -w "pwdMaxAge:" | cut -d : -f 2 \
                | sed "s/^ *//;s/ *$//"`
        pwdExpireWarning=`${ldap_search} | grep -w "pwdExpireWarning:" | cut -d : -f 2 \
                | sed "s/^ *//;s/ *$//"`
        pwdMinLength=`${ldap_search} | grep -w "pwdMinLength:" | cut -d : -f 2 \
                | sed "s/^ *//;s/ *$//"`
        pwdInHistory=`${ldap_search} | grep -w "pwdInHistory:" | cut -d : -f 2 \
                | sed "s/^ *//;s/ *$//"`
        if [ ! "${pwdMaxAge}" ]; then
                echo "${login} (${mail}) 해당 계정은 만료 설정이 되어 있지 않습니다." >> ${tmp_dir_stats}
                continue
        fi
        MY_MAIL_DELAY=${MY_MAIL_DELAY:=$pwdExpireWarning}
        if [ "${pwdChangedTime}" ]; then
                s=`echo ${pwdChangedTime} | cut -c 13-14`
                m=`echo ${pwdChangedTime} | cut -c 11-12`
                h=`echo ${pwdChangedTime} | cut -c 9-10`
                d=`echo ${pwdChangedTime} | cut -c 7-8`
                M=`echo ${pwdChangedTime} | cut -c 5-6`
                y=`echo ${pwdChangedTime} | cut -c 1-4`
                currentTime=`getTimeInSeconds`
                pwdChangedTime=`getTimeInSeconds "$y $M $d $h $m $s"`
                diffTime=`expr ${currentTime} - ${pwdChangedTime}`
        fi
        expireTime=`expr ${pwdChangedTime} + ${pwdMaxAge}`
        expireWarningTime=`expr ${pwdChangedTime} + ${MY_MAIL_DELAY}`
        if [ ${currentTime} -gt ${expireTime} ]; then
                nb_expired_users=`expr ${nb_expired_users} + 1`
                expireTime=`date -d @$expireTime "+%Y년 %B %d일 %A %T"`
                logmsg="${EX_MAIL_BODY}"
                logmsg=`echo -e ${logmsg} | sed "s/%name/${name}/; \
                        s/%login/${login}/; s/%expireTimeTZ/${expireTime}/; s/%pwdMinLength/${pwdMinLength}/; s/%pwdInHistory/${pwdInHistory}/; \
                        s/%expireDays/${expireDays}/"`
                #echo "${logmsg}" | ${MY_MAIL_BIN} -S "from=Infra Part <ldap>" -s "${MY_MAIL_SUBJECT}" ${mail} >&2
                echo "${logmsg}" | ${MY_MAIL_BIN} -S "from=Infra Part <ldap>" -s "${MY_MAIL_SUBJECT}" test@test.co.kr >&2
                echo "${login} 해당 계정이 ${expireTime} 부로 패스워드 정책에 의해 만료 되었습니다. ${mail} 해당 메일로 안내 메일이 발송 되었습니다." >> ${tmp_dir_stats}
                continue
        fi
        expireTimeTZ=`date -d @$expireTime "+%Y년 %B %d일 %A %T"`
        expireTimeMail=`date -d @$expireTime "+%s"`
        now=`date +%s`
        expireDays=`echo $(( (${expireTimeMail} - ${now} )/(60*60*24) ))`
        if [ "${mail}" -a "${name}" \
                -a "${login}" -a "${diffTime}" -a "${pwdMaxAge}" ]
        then
                diffTime=`expr ${diffTime} + ${MY_MAIL_DELAY}`
                #if [ ${diffTime} -gt ${pwdMaxAge} ]; then
                if [ ${currentTime} -gt ${expireWarningTime} -a ${currentTime} -lt ${expireTime} ]; then
                        logmsg="${MY_MAIL_BODY}"
                        logmsg=`echo -e ${logmsg} | sed "s/%name/${name}/; \
                                s/%login/${login}/; s/%expireTimeTZ/${expireTimeTZ}/; s/%pwdMinLength/${pwdMinLength}/; s/%pwdInHistory/${pwdInHistory}/; \
                                s/%expireDays/${expireDays}/"`
                        #echo "${logmsg}" | ${MY_MAIL_BIN} -S "from=Infra Part <ldap>" -s "${MY_MAIL_SUBJECT}" ${mail} >&2
                        echo "${logmsg}" | ${MY_MAIL_BIN} -S "from=Infra Part <ldap>" -s "${MY_MAIL_SUBJECT}" test@test.co.kr >&2
                        echo "${login} 해당 계정의 만료 날짜가 다가옵니다. ${mail} 해당 메일로 안내 발송 되었습니다. (만료 날짜, ${expireTimeTZ})." >> ${tmp_dir_stats}
                        nb_warning_users=`expr ${nb_warning_users} + 1`
                fi
        fi
done < ${result_file}
sed -i "1i관리자님,\n${MY_LOG_HEADER} 기준, 임직원 패스워드 상태 리스트 입니다.\n" ${tmp_dir_stats}
echo "Total 체크된 사용자: ${nb_users}" >> ${tmp_dir_stats}
echo "비밀번호 만료된 사용자: ${nb_expired_users}" >> ${tmp_dir_stats}
echo "비밀번호 만료 사전 안내된 사용자: ${nb_warning_users}" >> ${tmp_dir_stats}
sed -i -e '/^Total.*/i\\ ' -e '/^Total.*/i ===== 통계 =====' ${tmp_dir_stats}
#mail -S "from=Infra Part <ldap>" -s "[LDAP] 임직원 패스워드 만료 상태 리스트" infra_p@test.co.kr < ${tmp_dir_stats}
mail -S "from=Infra Part <ldap>" -s "[LDAP] 임직원 패스워드 만료 상태 리스트" t@test.co.kr < ${tmp_dir_stats}
rm -rf ${tmp_dir}
rm -rf ${tmp_dir_stats}
exit 0
728x90
300x250
728x90
반응형

개요

Openldap을 이용하여 패스워드 정책을 걸 수 있다.

패스워드 정책이란 패스워드 사용 기간이나 자릿수,특수문자,대소문자 등을 지정 할 수 있는 정책이다.

패스워드 정책에 대한 스키마는 기본적으로 설치가 되어 있으나 활성화를 해주어야 한다.

 


1. 패스워드 정책 스키마 파일이 존재하는지 확인

ls -ltr /etc/openldap/schema/ppolicy.ldif

2. 해당 정책 스키마를 추가

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif

3. 패스워드 정책 모듈 활성화

- vi로 ldif 파일 생성한다.

vi ppolicy-module.ldif
dn: cn=module{0},cn=config
cn: module{0}
objectClass: olcModuleList
olcModuleLoad: ppolicy.la
olcModulePath: /usr/lib64/openldap

4. 생성한 모듈 LDIF를 추가

ldapadd -Y EXTERNAL -H ldapi:/// -f ppolicy-module.ldif

5. 실제 모듈이 추가 되었는지 확인

slapcat -n 0 | grep olcModuleLoad

6. 정책을 세팅 할 디렉토리를 만들어 줘야 한다. 

vi ppolicy-ou.ldif
dn: ou=Policies,cn=manager,dc=test,dc=com
ou: Policies
objectClass: organizationalUnit
objectClass: extensibleObject
objectClass: top

7. 정책 OU 추가

ldapadd -Y EXTERNAL -H ldapi:/// -f ppolicy-ou.ldif

8. 생성한 정책 OU 밑에 기본적으로 사용할 패스워드 정책을 정의

vi ppolicy-password.ldif
dn: cn=default,ou=Policies,cn=manager,dc=test,dc=com
objectClass: top
objectClass: device
objectClass: pwdPolicy
objectClass: pwdPolicyChecker
cn: default
pwdAttribute: userPassword
pwdCheckQuality: 0
pwdFailureCountInterval: 120
pwdLockout: TRUE
pwdLockoutDuration: 0
pwdAllowUserChange: TRUE
pwdGraceAuthNLimit: 0
pwdMustChange: TRUE
pwdSafeModify: TRUE
pwdMinAge: 0
pwdMinLength: 8
pwdMaxFailure: 5
pwdInHistory: 2
pwdExpireWarning: 7171200
pwdMaxAge: 7776000

9. 생성한 LDIF 파일을 기반으로 반영

ldapadd -x -D cn=manager,dc=test,dc=com -w 패스워드 -f ppolicy-password.ldif

10. 실제로 해당 값이 반영 된 것을 볼 수 있다.

이렇게 되면 기본적으로 User를 추가 하면 위 정책을 따라가게 되어 있다.

해당 패스워드 정책에서 의미하는 바를 살펴보자

# 0이면 비활성화, 값이 1이면 서버가 검사할 수 없는 경우(해싱되었던가) 승인, 
# 값이 2면 서버가 이를 확인 할수 없으면 거부하는 오류는 반환
pwdCheckQuality: 0

# 패스워드 변경 후 특정 시간동안 암호 변경 못하게 설정
# 0이면 비활성화
pwdMinAge: 0

# 수정된 암호의 만료되는 시간(초) 설정 값이 0이면 만료되지 않음
pwdMaxAge: 1800

# 패스워드 최소 글자
pwdMinLength: 7

# 예전 암호 저장
pwdInHistory: 3

# 패스워드 연속 실패 횟수
pwdMaxFailure: 3

# 패스워드 실패 후 재시도에 대한 대기 시간(초)
pwdFailureCountInterval: 0

# TRUE일 때 바인드 계정 인증 시 pwdMaxFailure를 따를 것인지?
pwdLockout: TRUE
728x90
# 바인드 시도 실패 횟수 초과로 재시도에 대한 대기 시간(초)
# 값이 0 이면 관리자가 재설정 할 때까지 암호를 사용 할 수 없음
pwdLockoutDuration: 0

# 자신이 암호를 변경 할 수 있는지 여부
pwdAllowUserChange: TRUE

# 암호 만료 경고메시지가 사용자에게 반환 되는 시간(초)
# pwdMaxAge 값보다 작아야함
pwdExpireWarning: 0

# 만료된 암호를 사용하여 인증 할 수 있는 횟수
# 값이 0 이면 로그인 안됨
pwdGraceAuthNLimit: 0

# 비밀번호 재설정 후 디렉토리에 처음 바인드할때 항목이 비밀번호를 변경해야 함이 TRUE
# FALSE면 사용자는 관리자가 암호를 설정하거나 재설정 후 바인딩 할 때 암호를 변경할 필요가 없음
pwdMustChange: TRUE

# 암호 변경 시 기존 암호와 새 암호를 함께 보내야 하는지 여부 결정
pwdSafeModify: TRUE

특정 User에게만 패스워드 정책 예외 시키기

개요

일부 시스템에서 사용하는 관리자 계정이나, 어디와 연동 되어 있는 특정 계정들에 대해서는

패스워드 만료를 시키고 싶지 않을 경우가 있을 것이다.

그럴경우 해당 설정으로 패스워드 정책으로부터 예외 처리 시키기 위함이다.

 

1. 패스워드 만료가 되지 않기 위한 Exclude 정책 생성

vi ppolicy-exclude.ldif
dn: cn=e,cn=default,ou=Policies,cn=manager,dc=test,dc=com
objectClass: top
objectClass: device
objectClass: pwdPolicy
objectClass: pwdPolicyChecker
cn: e
pwdAttribute: userPassword
pwdCheckQuality: 0
pwdMinAge: 0
pwdMinLength: 8
pwdInHistory: 5
pwdMaxFailure: 3
pwdFailureCountInterval: 0
pwdLockout: TRUE
pwdLockoutDuration: 0
pwdAllowUserChange: TRUE
pwdGraceAuthNLimit: 0
pwdMustChange: FALSE
pwdSafeModify: FALSE

2. 생성한 LDIF 적용하기

ldapadd -x -D cn=manager,dc=test,dc=com -w 패스워드 -f ppolicy-exclude.ldif

3. Exclude User 지정을 위한 LDIF 생성

vi excludePasswordPolicy.ldif
dn: uid=t1234,ou=People,dc=test,dc=com
changetype: modify
add: pwdPolicySubentry
pwdPolicySubentry: cn=e,cn=default,ou=Policies,cn=manager,dc=test,dc=com

4. LDIF 적용하기

/usr/bin/ldapmodify -x -D cn=manager,dc=test,dc=com -w 패스워드 -f excludePasswordPolicy.ldif

5. 패스워드 예외 적용 확인

ldapsearch -Y EXTERNAL -H ldapi:/// -s one -b "ou=People,dc=test,dc=com" -LLL -Q uid pwdPolicySubentry

dn: uid=t1234,ou=People,dc=test,dc=com
uid: t1234
pwdPolicySubentry: cn=e,cn=default,ou=Policies,cn=manager,dc=test,dc=com

이렇게 해서 패스워드 정책에서 예외처리를 할 수 있다.

예외처리 해 놓은 유저를 다시 default 정책으로 적용 시키려면 아래와 같이 진행하시오

vi deletePasswordPolicy.ldif
dn: uid=t1234,ou=People,dc=test,dc=com
changetype: modify
delete: pwdPolicySubentry
/usr/bin/ldapmodify -x -D cn=manager,dc=test,dc=com -w 패스워드 -f deletePasswordPolicy.ldif

 

728x90
300x250
728x90
반응형

실제 관리하는 사람 입장에서 필요한 커맨드라인 정리이다.

 

 

1. 한글 이름 그룹에 속해 있는 멤버 찾기 (인코딩이 포함 되어 있음)

/usr/bin/ldapsearch -xLLL -H ldap://IP주소 -b "cn=팀이름,ou=Group,dc=test,dc=com" |  perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print'

2. 특정 사용자 패스워드 변경

/usr/bin/ldappasswd -s 변경할 사용자 암호 -w BIND DN 암호 -D cn=manager,dc=test,dc=com -x "uid=사용자,ou=People,dc=test,dc=com"

3. 특정 사용자 삭제

/usr/bin/ldapdelete -x -D cn=manager,dc=test,dc=com -w BIND DN 암호 uid=사용자,ou=People,dc=test,dc=com

4. 부가적인 CONFIG 설정 확인 (like LogLevel)

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config  -s base

5. 등록된 스키마 리스트 확인

ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn

6. 사용자의 정보 보기

ldapsearch -xLLL -H ldap://IP -b "uid=사용자,ou=People,dc=test,dc=com"
728x90

7. 그룹의 정보 보기

ldapsearch -xLLL -H ldap://IP -b "cn=그룹명,ou=Group,dc=test,dc=com"

8. 쿼리 추가하여 검색하기 (like pwdPolicySubentry 적용자 보기 등)

ldapsearch -Y EXTERNAL -H ldapi:/// -s one -b "ou=People,dc=test,dc=com" -LLL -Q pwdPolicySubentry
728x90
300x250
728x90
반응형

개요

그룹웨어 User 테이블에서 사용자 정보를 불러와서,

LDAP에 자동으로 등록 처리 해주는 구문이다.

새로 추가되는 팀이 있다면, 사용자가 팀을 이동한다면 또한 자동 관리 된다.

 

해당 스크립을 ldap crontab에 등록 해주면 스케쥴링되어 자동으로 세팅 될 것이다.

#!/bin/bash
/usr/bin/python /usr/share/openldap-servers/userExports.py

sleep 50

cn=(`/usr/bin/cat /usr/share/openldap-servers/userList.json | jq .userid | cut -d\" -f2`)
uid=(`/usr/bin/cat /usr/share/openldap-servers/userList.json | jq .userid | cut -d\" -f2`)
sn=(`/usr/bin/cat /usr/share/openldap-servers/userList.json | jq .username | cut -d\" -f2`)
groupCode=(`/usr/bin/cat /usr/share/openldap-servers/userList.json | jq .deptcode | cut -d\" -f2`)
groupName=(`/usr/bin/cat /usr/share/openldap-servers/userList.json | jq .deptname | cut -d\" -f2 | sed 's/ //g'`)
mailaddr=(`/usr/bin/cat /usr/share/openldap-servers/userList.json | jq .mailaddr | cut -d\" -f2`)
userDeleteList=(`/usr/bin/cat /usr/share/openldap-servers/userStopList.json | jq .userid | cut -d\" -f2`)
/usr/bin/ldapsearch -xLLL -H ldap://IP_ADDRESS -b "ou=Group,dc=test,dc=com" | grep "cn:" | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print' | awk '{print $2}' > /usr/share/openldap-servers/groupList.lst
groupList=(`/usr/bin/cat /usr/share/openldap-servers/groupList.lst`)
gwTotalGroupList=(`/usr/bin/cat /usr/share/openldap-servers/gwTotalGroupList.lst | jq .deptname | cut -d\" -f2`)
finalUID=
finalSN=
finalMail=

# 사용자 생성
userCreate() {
/usr/bin/cat > /usr/share/openldap-servers/userCreate.ldif <<EOF
dn: uid=${finalUID},ou=People,dc=test,dc=com
objectClass: posixAccount
objectClass: top
objectClass: inetOrgPerson
objectClass: sambaSamAccount
displayName: ${finalUID}
uid: ${finalUID}
homeDirectory: /home/${finalUID}
sambaKickoffTime: 2147483647
sambaAcctFlags: [U]
uidNumber: ${uidNumber}
sambaSID: ${sambaSID}
sambaDomainName: REFINEHUB.COM
sn: ${finalSN}
mail: ${finalMail}
cn: ${finalUID}
gidNumber: ${gidNumber}
sambaNTPassword: 4EFAB4E3D4DD4A1B5837C600E13F5794
sambaPwdLastSet: 1643023108
sambaPrimaryGroupSID: S-1-5-21-2943257643-222489679-77770093-16330
EOF
/usr/bin/ldapadd -x -D cn=manager,dc=test,dc=com -w Wjstkstlf12 -f /usr/share/openldap-servers/userCreate.ldif
verifyUser=`/usr/bin/ldapsearch -xLLL -H ldap://IP_ADDRESS -b "ou=People,dc=test,dc=com" "(&(uid=${finalUID}))" | grep "cn: " | cut -d: -f 2 | sed 's/^ //'`
if [[ -n ${verifyUser} ]]; then
    /usr/bin/ldappasswd -s Password\$710 -w Wjstkstlf12 -D cn=manager,dc=test,dc=com -x "uid=${finalUID},ou=People,dc=test,dc=com"
fi
}

# 팀에 사용자 추가
userAddInGroup(){
/usr/bin/cat > /usr/share/openldap-servers/userAddInGroup.ldif <<EOF
dn: cn=${groupName[$id]},ou=Group,dc=test,dc=com
changetype: modify
add: memberUid
memberUid: ${finalUID}
EOF
/usr/bin/ldapmodify -x -D cn=manager,dc=test,dc=com -w Wjstkstlf12 -f /usr/share/openldap-servers/userAddInGroup.ldif
}

# 새로운 팀을 생성
newGroupCreate(){
/usr/bin/cat > /usr/share/openldap-servers/newGroupCreate.ldif <<EOF
dn: cn=${groupName[$id]},ou=Group,dc=test,dc=com
objectClass: posixGroup
objectClass: top
objectClass: sambaGroupMapping
cn: ${groupName[$id]}
sambaGroupType: 2
displayName: ${groupName[$id]}
gidNumber: ${gidNumber}
sambaSID: ${sambaSID}
EOF
/usr/bin/ldapadd -x -D cn=manager,dc=test,dc=com -w Wjstkstlf12 -f /usr/share/openldap-servers/newGroupCreate.ldif
}

# GrafanaAdmin 같은 그룹웨어 통해 생성한 그룹이 아닌 LDAP 자체에서 생성한 임의의 그룹인지 비교 후 이전 그룹(팀)에서 사용자 삭제
deleteUserInGroup() {
gwGroupCompare2=`/usr/bin/cat /usr/share/openldap-servers/userList.json | jq .deptname | cut -d\" -f2 | sed 's/ //g' | grep ${groupName[$id]} | uniq`
gwGroupCompare=`/usr/bin/cat /usr/share/openldap-servers/gwTotalGroupList.lst | jq .deptname | cut -d\" -f2 | sed 's/ //g' | grep ${line}`
echo "deleteUserInGroup ${gwGroupCompare2} ${gwGroupCompare} ${uid[$id]} ${groupName[$id]}" >> /usr/share/openldap-servers/log
if [[ "${gwGroupCompare2}" != "${gwGroupCompare}" ]] && [[ -z "${gwGroupCompare}" ]]; then
/usr/bin/cat > /usr/share/openldap-servers/deleteUserInGroup.ldif <<EOF
dn: cn=${line},ou=Group,dc=test,dc=com
changetype: modify
delete: memberUid
memberUid: ${uid[$id]}
EOF
/usr/bin/ldapmodify -x -D cn=manager,dc=test,dc=com -w Wjstkstlf12 -f /usr/share/openldap-servers/deleteUserInGroup.ldif
fi
gwGroupCompare=""
}

# 새로운 팀에 해당 사용자를 추가
addUserInNewGroup(){
/usr/bin/cat > /usr/share/openldap-servers/addUserInNewGroup.ldif <<EOF
dn: cn=${groupName[$id]},ou=Group,dc=test,dc=com
changetype: modify
add: memberUid
memberUid: ${uid[$id]}
EOF
/usr/bin/ldapmodify -x -D cn=manager,dc=test,dc=com -w Wjstkstlf12 -f /usr/share/openldap-servers/addUserInNewGroup.ldif
}

for id in "${!groupName[@]}"; do 
    uidNumber=(`/usr/bin/cat /dev/urandom | tr -dc '0-9' | fold -w 6 | sed 1q`)
    sambaSID=S-1-5-21-2943257643-222489679-77770093-$(/usr/bin/cat /dev/urandom | tr -dc '0-9' | fold -w 5 | sed 1q)
    gidNumber=(`/usr/bin/cat /dev/urandom | tr -dc '0-9' | fold -w 6 | sed 1q`)
    #id2=`expr ${id} + 1`

    # LDAP 사용자의 무슨 팀인지 확인
    searchingGroupOfUser=`/usr/bin/ldapsearch -xLLL -H ldap://IP_ADDRESS -b "ou=Group,dc=test,dc=com" "(&(memberUid=${uid[$id]}))" | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print' | grep "cn:" | cut -d: -f 3 | sed 's/^ //' > /usr/share/openldap-servers/searchingGroupOfUser.lst`
    
    # 팀이 바뀐 직원이 있는지 체크
    while read line; do
    #searchingLdapUser=`/usr/bin/ldapsearch -xLLL -H ldap://IP_ADDRESS -b "cn=${line},ou=Group,dc=test,dc=com" | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print' | grep ${uid[$id]} | cut -d: -f 2 | sed 's/^ //'`
    if [[ "${line}" != "${groupName[$id]}" ]]; then
    #if [[ "${searchingLdapUser}" != "${groupName[$id]}" ]]; then
        deleteUserInGroup
        addUserInNewGroup
        else
            continue
    fi
    done < /usr/share/openldap-servers/searchingGroupOfUser.lst


    # LDAP 그룹 조회
    searchingGroupList=`/usr/bin/cat /usr/share/openldap-servers/groupList.lst | grep ${groupName[$id]}`

    # 사용자 생성 단계
    # 새로운 팀이 생긴 건지 아닌지 판단
    if [[ "${groupName[$id]}" == "${searchingGroupList}" ]]; then
            finalUID=${uid[$id]}
            finalSN=${sn[$id]}
            finalMail=${mailaddr[$id]}
            userCreate
            userAddInGroup
        else
    # 새로운 팀 추가
            newGroupCreate
            finalUID=${uid[$id]}
            finalSN=${sn[$id]}
            finalMail=${mailaddr[$id]}
            userCreate
            userAddInGroup
    fi

    #겸임 하는 사람에 대해 체크하여 1개 이상의 그룹을 갖도록 추가
    countGroupOfUser=`/usr/bin/cat /usr/share/openldap-servers/userList.json | jq .userid | cut -d\" -f2 | sed 's/ //g' | grep ${uid[$id]} | wc -l`
    if [[ ${countGroupOfUser} -gt 2 ]]; then
        echo "countGroupOfUser ${countGroupOfUser} ${uid[$id]} ${groupName[$id]}" >> /usr/share/openldap-servers/log
        addUserInNewGroup
        else
            continue
    fi

done

# 퇴사자가 있으면 삭제
for empno in "${!userDeleteList[@]}"; do
/usr/bin/ldapsearch -xLLL -H ldap://IP_ADDRESS -b "ou=Group,dc=test,dc=com" "(&(memberUid=${userDeleteList[empno]}))" | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print' | grep "cn:" | cut -d: -f 3 | sed 's/^ //' > /usr/share/openldap-servers/exitedUserInGroup.lst
exitedUserInGroup=`/usr/bin/cat /usr/share/openldap-servers/exitedUserInGroup.lst`
/usr/bin/cat > /usr/share/openldap-servers/exitedUserInGroup.ldif <<EOF
dn: cn=${exitedUserInGroup},ou=Group,dc=test,dc=com
changetype: modify
delete: memberUid
memberUid: ${userDeleteList[empno]}
EOF
/usr/bin/ldapmodify -x -D cn=manager,dc=test,dc=com -w Wjstkstlf12 -f /usr/share/openldap-servers/exitedUserInGroup.ldif
/usr/bin/ldapdelete -x -D cn=manager,dc=test,dc=com -w Wjstkstlf12 uid=${userDeleteList[empno]},ou=People,dc=test,dc=com
done
728x90
300x250
728x90
반응형

0. Logging 설정 됐는지 확인

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config -s base|grep -i LOG
# olcLogLevel: -1 가 나와야 함

1. Logging 설정을 위한 ldif 파일 생성

vi /root/logging.ldif

# 아래 내용 입력
dn: cn=config
replace: olcLogLevel
olcLogLevel: -1

2. 생성한 ldif 파일로 적용

ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/logging.ldif

3. 적용 확인

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config -s base|grep -i LOG

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcLogLevel: -1

4. 서비스 리스타트

systemctl restart slapd

5. syslog로 등록

vi /etc/rsyslog.conf

# 아래 추가
local4.* -/var/log/slapd.log

# syslog 서비스 재시작
systemctl restart rsyslog

6. Logrotate 설정

vi /etc/logrotate.d/syslog

# 해당 라인 추가
/var/log/slapd.log

7. Logging Level List

728x90
Level Keyword Description
-1 any enable all debugging
0   no debugging
1 (0x1 trace) trace function calls
2 (0x2 packets) debug packet handling
4 (0x4 args) heavy trace debugging
8 (0x8 conns) connection management
16 (0x10 BER) print out packets sent and received
32 (0x20 filter) search filter processing
64 (0x40 config) configuration processing
128 (0x80 ACL) access control list processing
256 (0x100 stats) stats log connections/operations/results
512 (0x200 stats2) stats log entries sent
1024 (0x400 shell) print communication with shell backends
2048 (0x800 parse) print entry parsing debugging
16384 (0x4000 sync) syncrepl consumer processing
32768 (0x8000 none) only messages that get logged whatever log level is set
728x90
300x250
728x90
반응형

1. OpenLDAP 설치

yum install -y compat-openldap openldap openldap-servers openldap-clients openldap-servers-sql openldap-devel samba-common samba samba-client cifs-utils

2. OpenLDAP DB 설정

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG

3. 서비스 등록

systemctl --now enable slapd.service

4. 서비스 확인

systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-06-11 16:23:18 KST; 22min ago
     Docs: man:slapd
           man:slapd-config
           man:slapd-hdb
           man:slapd-mdb
           file:///usr/share/doc/openldap-servers/guide.html
  Process: 7786 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
  Process: 7757 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
 Main PID: 7789 (slapd)
   CGroup: /system.slice/slapd.service
           └─7789 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///
netstat -nlp | grep 389
ps -ef | grep -v grep | grep slapd

5. OpenLDAP 구성

slappasswd -h {SSHA} -s 패스워드입력
{SSHA}TuXt7LyRbmpzacWE4jjjdi8zUQNEcNYz

6. LDAP Admin 계정 생성 및 등록

cat <<EOF > chrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}TuXt7LyRbmpzacWE4jjjdi8zUQNEcNYz
EOF
728x90
ldapmodify -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif

--output--
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

7. LDAP 스키마(cosine.ldif, nis.ldif, inetorgperson.ldif) 추가

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

cp -av /usr/share/doc/samba-4.10.16/LDAP/samba.ldif /etc/openldap/schema/samba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/samba.ldif

8. Domain 수정 작업

cat <<EOF > chdomain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=manager,dc=test,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=test,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=manager,dc=test,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}TuXt7LyRbmpzacWE4jjjdi8zUQNEcNYz

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=manager,dc=test,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=manager,dc=test,dc=com" write by * read
EOF
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif

--output--
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"
cat <<EOF > basedomain.ldif
dn: dc=test,dc=com
o: test
dc: test
objectClass: top
objectClass: dcObject
objectclass: organization

dn: cn=manager,dc=test,dc=com
objectClass: organizationalRole
cn: manager
description: Directory Manager

dn: ou=People,dc=test,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=test,dc=com
objectClass: organizationalUnit
ou: Group
EOF
ldapadd -x -D cn=manager,dc=test,dc=com -W -f basedomain.ldif

9. User 생성 작업

cat <<EOF > useradd.ldif
dn: uid=testuser,ou=People,dc=test,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: testuser
uid: testuser
uidNumber: 1500
gidNumber: 1500
homeDirectory: /home/testuser
loginShell: /bin/bash
gecos: 
userPassword: {crypt}x
shadowLastChange: 17058
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
EOF
ldapadd -x -D cn=manager,dc=test,dc=com -W -f useradd.ldif

10. SAMBA 세팅 (/etc/samba/smb.conf)

# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
        workgroup = test.com
        security = user

        passdb backend = tdbsam
#       passdb backend = ldapsam:ldap://1.1.1.1
        ldap suffix = dc=test,dc=com
        ldap user suffix = ou=People
        ldap group suffix = ou=Group
        ldap delete dn = no
        ldap admin dn = cn=manager
        ldap ssl = no
        ldap passwd sync = yes
        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

11. slapd.conf 세팅

# 안에 도메인 수정
cp -av /usr/share/openldap-servers/slapd.ldif /etc/openldap/slapd.conf

12. 상태

pwd
/etc/openldap/slapd.d/cn=config

ls -ltr
total 20
-rw------- 1 ldap ldap 443 Jan 13 13:14 olcDatabase={-1}frontend.ldif
-rw------- 1 ldap ldap 378 Jan 13 13:14 cn=schema.ldif
-rw------- 1 ldap ldap 624 Jan 13 16:51 olcDatabase={0}config.ldif
drwxr-x--- 2 ldap ldap 132 Jan 13 17:44 cn=schema
-rw------- 1 ldap ldap 608 Jan 14 10:07 olcDatabase={1}monitor.ldif
-rw------- 1 ldap ldap 974 Jan 14 10:07 olcDatabase={2}hdb.ldif

13. LDAP Admin으로 관리

http://www.ldapadmin.org/download/ldapadmin.html

 


OpenLDAP 삭제

1. 서비스 중지

systemctl stop slapd

2. 패키지 삭제

yum remove openldap-servers
Removing:
 openldap-servers

3. DB 삭제

rm -rf /var/lib/ldap

4. 계정 삭제

userdel ldap

5. LDAP 재설치

systemctl stop slapd
systemctl stop nscd.service

rm -rf /var/lib/ldap
rm -rf /etc/openldap
rm -rf /run/openldap 
rm -rf /usr/lib64/openldap /usr/libexec/openldap

yum reinstall -y openldap openldap-servers openldap-clients
728x90
300x250

'IT > OpenLDAP' 카테고리의 다른 글

LDAP 사용자 자동 등록 처리  (0) 2022.02.15
OpenLDAP Logging 설정 방법  (0) 2022.02.03
LDAP Account Manager의 설정  (0) 2021.07.30
OpenLDAP memberOf overlay  (0) 2021.07.30
OpenLDAP ACL에 대한 설명  (0) 2021.07.30
728x90
반응형

개요

LDAP계정 관리에 특화된 브라우저 베이스에서 사용할 수 있는 GUI도구. 프리판도 있지만 Pro판은 아래의 기능이 있다.

  • 사용자가 패스워드 설정 가능
  • 커스텀 스키마 설정

여기에서는 Pro판 구입으로, 사이트로 로그인하고 오른쪽 위의 링크(LAM Pro releases)에서 다운로드 가능.
계정 정보는 별도로 사내에 메모하여 관리 해둡니다.

 

 

설치

Fedora용 rpm을 내려받아 설치할 뿐. Apache로 동작하는 것이 전제가 되어 있고, Apache의 conf.d이하로 설정이 설치된다. 이 경우 Apache의 재기동 할 뿐 아무것도 안 해도 그대로 이용 할 수 있다.

# rpm -ivh ldap-account-manager-VERSION.fedora.1.noarch.rpm

 

초기 설정

  1. 브라우저에서 URL에 접속한다.기본적으로/lam이 앨리어스 설정되어 있으므로 다음과 같은 느낌이다.
    예)http://ldap.example.jp/lam
  2. 언어 설정하고, 오른쪽 위의 "LAM구성 설정"에서 "일반 설정을 갱신"에. 로그인 디폴트 패스는 "lam"에서 이는 LDAP자체와 관계 없이 LDAP Account Manager의 설정 접속 패스워드.
  3. 마스터 패스워드를 변경, SSL 증명서를 업로드 한다 (와일드 카드 증명서를 사용하고 있지만 이것을 하지 않으면 왠지 잘 접속이 안된다).
  4. 「LAM 구성 설정」에서 「서버 프로필의 설정」으로. 서버 프로필 조작으로 lam을 naver으로 변경.
  5. 「서버 프로파일의 설정」에서 변경한 「naver」의 설정을 실시한다. 초기 패스워드는 "lam"이므로 이쪽도 변경한다.
  6. 서버 주소로 「ldaps://~」를 사용하는 경우는 TLS를 유효화는 「아니오」인 채로 둔다. 이것은 「starttls」옵션의 설정으로, 암호화되지 않는 통신에 대해 실제의 데이터의 교환으로 TLS로 전환하는가의 설정.ldaps로 통신을 개시하는 경우는 불필요한 설정.

SSL은 naver.com 의 와일드 카드 증명서를 취득하고 있으므로 클라이언트측의 설정은 필요없다 (자체 서명 인증서 아님).

728x90
300x250

'IT > OpenLDAP' 카테고리의 다른 글

OpenLDAP Logging 설정 방법  (0) 2022.02.03
(최신) Amazon Linux 2에서 OpenLDAP 구성 (with SAMBA)  (0) 2022.01.14
OpenLDAP memberOf overlay  (0) 2021.07.30
OpenLDAP ACL에 대한 설명  (0) 2021.07.30
OpenLDAP 백업 설정  (0) 2021.07.30

+ Recent posts