Unix/Solaris10

솔라리스를 액티브디렉토리에 물리는 방법

ForceCore 2008. 11. 29. 17:17
그동안 계속 실패해왔었다.
그러다 삼바까지 동원해서 억지로 성공하긴 했으나, uidnumber라든가 이런 property가 잘 계승되지 않아서 기분 나빴다. 이제 아름다운 방법이 나왔으니...


좋은 문서다.

공지사항의 서비스 관계도를 염두에 두고 읽으면 읽기 좀 더 편하다.
아래 글에서, 그림에 나온 서버이름들을 사용하였으므로.
http://forcecore.tistory.com/notice/828

Windows 2003 서버쪽 설정 (prime.sohee)
Windows 2003 R2 서버쪽에서는 Identity Management for UNIX를 설치하라고 한다.
참 쉽죠?
그리고 통합로그인이 가능한 테스트 계정도 생성해주자.
성공적으로 설치가 되었다면, 액티브디렉토리 계정의 속성을 봤을 때,
UNIX Attributes 라는 탭이 새로 생겨 있어야 한다.
그리고 그 곳에 뭐 적당한... property들을 입력해주면 로그인도 가능해진다.

뿐만 아니라 DNS 설정도 해야 한다.
액티브디렉토리에 물릴 서버의 IP주소와 도메인명을 DNS에 입력해주자.
안 그러면, 로그인을 성공하지 못한다.

주어진 문서를 읽어보면, tuning을 할 수도 있는데, 튜닝하면 성능이 더 좋아진다는 것이지 필수는 아니다. 필자는 귀찮아서 안 했다.

Kerberos 설정 (watery.sohee)
예전에 열심히 했었다. 그런데 다시 찾으려니 못 하겠군.
어쨌거나 예전에 귀찮게 손으로 했던 것은 자동화 되었다 +_+
문서에도, "For More Information"부분을 읽으면, adjoin tool을 받을 수 있지만,
여기에도 첨부하겠다.


이 두 개면 아주 쉽다... 너무 쉬워서 화가 날 정도로 ㅋ_ㅋ

압축을 해제하고 그 해제된 디렉토리 안에 들어가보면
README, i386, sparc, src 디렉토리가 있다.
src안의 adjoin.sh는 chmod로 +x를 걸어 주어야 한다.

README를 잘 읽어보면 윈도우 서버 2008에서는 스크립트에서 약간 바꾸어야 하는 부분이 있는 모양인데 필자는 2003을 사용중인지라, 그냥 그렇다고 알아만 두고 패스.

./adjoin을 실행시키면...
도메인 물리기 실패.
왜냐...
/etc/resolv.conf의
domain과 search를 SOHEE.xxx.ac.kr로 해야 하기 때문이다.
그리고 /etc/nsswitch.conf도 DNS를 이용해 host를 찾도록 변경해 주어야 한다.
뭐 상관 없다. 어차피 AD에 물릴 것이라면, AD서버로 hostname을 resolve하게 할 것 아닌가?
작업이 끝난 뒤에는 search를 xxx.ac.kr로 다시 변경해도 무방하... 지 않다.
그냥 xxx.ac.kr로 변경하면 끝까지 해서 AD서버에 물리는 데 성공해도, 도로묵 된다.
이 점 유의하길.

adjoin이 있는 곳에, ksetpw 바이너리 파일이 있어야만 한다.
i386과 sparc이 지원되며, 나머지 platform의 경우는, 컴파일을 해야만 한다.

./adjoin을 다시 실행시키면, domain과 search가 제대로 되어 있다면,
domain으로 지정된 도메인의 AD서버에 물리려고 시도할 것이다.
성공하면, AD의 컴퓨터 목록에 watery가 보여야 한다 +_+

문서를 읽어보면 ldapsearch를 해보면 뭐가 나오는 것 처럼 되어있는데 사기다. -_-;
GSSAPI method로 ldapsearch가 안 된다... 아니, 되나?
실전 배치를 하면서 OS를 재설치 해야 하겠지만,
watery서버에 솔라리스를 설치한지 꽤 되었다...a 1년 정도 된듯.
그래서 안 되는 것일수도 있다.

어쨌거나 klist를 쳐보면,
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: host/watery.sohee.xxx.ac.kr@SOHEE.XXX.AC.KR

Valid starting                Expires                Service principal
11/21/08 22:34:46  11/22/08 08:33:23  krbtgt/SOHEE.XXX.AC.KR@SOEE2.SNU.AC.KR
        renew until 11/22/08 08:34:46
11/21/08 22:33:23  11/22/08 08:33:23  ldap/prime.sohee.xxx.ac.kr@SOHEE.XXX.AC.KR

        renew until 11/22/08 08:34:46
이런 것이 보여야 한다.

매뉴얼에는 ldapsearch를 내리면 뭐가 결과가 나오는 양 써있는데 그렇지 않다.
매뉴얼의 ldapsearch에는 없는 옵션이 좀... 있어서. 솔라리스 버전따라 그런지도 모르겠다.
필자는 약간 구버전의 솔라리스에서 테스트 해본지라.

LDAP Client 설정
필자는 이 단계에서 많이 좌절했었다. 하지만 이제 성공했다. 후웃.
getent passwd를 해도 사용자 목록이 보이지를 않고,
# ldaplist -l passwd
ldaplist: Object not found (LDAP ERROR (12): Unavailable critical extension.)
라고 하기 때문...
(ldaplist는 root로서 해야 한다;;)
필자가 이건 몰랐다. 액티브디렉토리는 원래 그렇다 ㄱ-;; 어쨌건. CentOS에서는 그래도 getent passwd하면 사용자가 보였기 때문에 속았지... 어쨌거나,
# ldaplist -l passwd 사용자ID
를 하면 제대로 계정 정보가 읽혀 온다. 이 점을 염두에 두고, getent passwd를 수시로 쳐보면서, 안 되네... 라고 좌절하지 말고 진행해보자.

우선은 DNS 서버를 Active Directory로 설정해야 한다.
/etc/resolv.conf를 잘 설정하기 바란다.

nslookup watery.snu.ac.kr
해서 답이 208.67.219.111 로 나왔으면,
nslookup 208.67.219.111 은
watery.snu.ac.kr
로 제대로 나올 수 있는 환경으로 만들어 놓는다.
이를 위해서는 액티브디렉토리의 DNS 서버를 설정해서
watery를 등록해줘야 한다.

ldapclient가 제대로 동작하기 위해서는, nsswitch.ldap파일 자체를 올바르게 설정해줄 필요가 있다(오, 그런줄은 몰랐다. 그동안 이것을 nsswitch.conf에 덧씌운 적은 있었다). 그것을 편집해서, hosts, ipnodes를 DNS lookup하도록 만든다.
hosts: dns files
ipnodes: dns files
이런 내용으로 고치면 된다.

또한, NSCD와 DNS client가 동작하고 있어야만 한다. NSCD가 동작하지 않으면... 나중에 큰일난다. 아래의 필자가 부딪혔던 문제점에 적혀있지만... 어쨌든 부딪히고 싶지는 않을테니, 두 데몬을 켜주자. DNS야 보통은 동작하고 있을테고 ㄱ-;;
# svcadm enable /network/dns/client
# svcadm enable name-service-cache

이제 ldapclient를 돌릴 차례.
parameter를 고치면서 시행착오를 여러번 하게 될텐데 매번 명령어를 치든지, 메모장에서 긁어 붙이기는 고된 작업이다. 아예 shell script로 만들어버리자.
#!/bin/bash
ldapclient -v manual \
-a credentialLevel=self \
-a authenticationMethod=sasl/gssapi \
-a defaultSearchBase=dc=sohee,dc=xxx,dc=ac,dc=kr \
-a domainName=sohee.xxx.ac.kr \
-a defaultServerList=208.67.219.249 \
-a attributeMap=passwd:gecos=cn \
-a attributeMap=passwd:homedirectory=unixHomeDirectory \
-a objectClassMap=group:posixGroup=group \
-a objectClassMap=passwd:posixAccount=user \
-a objectClassMap=shadow:shadowAccount=user \
-a serviceSearchDescriptor=passwd:ou=normalusers,dc=sohee,dc=xxx,dc=ac,dc=kr?sub \
-a serviceSearchDescriptor=group:ou=normalusers,dc=sohee,dc=xxx,dc=ac,dc=kr?sub \

필자가 성공한 설정은 위와 같다. 물론 default server list는 sohee.xxx.ac.kr의 IP주소다. 필자의 AD서버는 services for unix가 아니라 문서에서처럼, Identity Management for UNIX를 사용하고 있다. Services for unix를 쓴다면 아래의 attributeMap같은 parameter가 달라진다. 필자의 경우 여러번 실패를 반복했는데... 초기에는 액티브디렉토리 자체에 bind하는 데 실패했다. dmesg를 치면서 디버깅 했나... 기억이 잘 안난다. OTL 아니면 ldapclient가 log를 남겼던가... 아니면 -v가 verbose 옵션이어서 자세한 에러 내역이 직접 화면에 출력 되었던가...

도메인에 물리기는 성공했다면, PAM설정을 하자. PAM설정에 대해서는 첨부된 pdf파일을 보라. 설명하기 귀찮다. 어렵지 않을 것이다. 그대로 따라하면 정확히 동작한다.

성공했다면,
$ getent passwd 사용자id
명령어가 잘 먹힐 것이다. 주의할 점은, 그냥 getent passwd만 하면 local 게정만 보인다는 것이다 -_-;
또한
$ ldaplist -l passwd 사용자id
라고 해도 사용자 정보가 잘 보일 것이다.
실패한다면? serviceSearchDescriptor가 잘못된 것이다. 그러니까,
ou=normalusers,dc=sohee,dc=xxx,dc=ac,dc=kr?sub
이 부분은, 사용자가 active directory의 어느 "디렉토리"에 저장되어 있는지를 지정하는 부분이다.
sub를 빼먹으면, 하위디렉토리를 검색하지 않는다. 그 점을 유의해야 한다.
만약, 필자처럼 사용자를 저장하는 OU를 따로 두지 않고 액티브 디렉토리의 users cn을 그대로 사용한다면, 매뉴얼에서처럼
cn=users,DC=sohee,dc=xxx,dc=ac,dc=kr?one
이렇게 하면 된다. 저 안에 하위디렉토리도 검색해야 하면 one을 sub로 고친다.


참고로. 필자가 부딪혔던 문제점들이다.

첨부된 kerberos_s10.pdf에서 , ldapclient 어쩌구저쩌구 하는 명령어의 parameter로 serviceSearchDescriptor 가 있는데, 이를 엉터리로 주면 AD client가 계정을 인식하지 못하여 로그인을 실패하게 된다.

액티브 디렉토리와는 무관한 문제지만.
다른 리눅스 서버의 NFS 공유를 마운트 시키려고 하니까 실패했다.
dmesg를 쳐보면 원인이 나오는데, 그 원인으로는
NFS: not owner
이런 내용의 에러가 뜬다.
아니, cd로 들어가려고 하는 때 에러가 뜨던가... 몇일 전이라 기억이 조금 가물가물 하다.
version 4의 NFS로 접속하려고 해서 문제가 생기는 것이다... 약간 솔라리스와 리눅스간의 호환이 잘 안 맞아서.
2004 -vers=3,-fstype=nfs,hard,intr,rw storage2.xxx.ac.kr:/export/disk1/2004
필자의 auto_home 내용이다. 버전 3으로 마운트 시키면 OK.

역시 또 괜히 로그인이 안 되어서 디버깅 하려고 dmesg를 쳐보면 이런 경우가 나타난다.
krb5_verify_init_creds failed: Server not found in Kerberos database
이런 경우는 액티브디렉토리 서버의 DNS서버에, AD클라이언트 서버를 손으로 추가해주면 된다.

$ getent passwd user1
위와 같은 명령어로 보면 제대로 사용자 계정 정보도 잘 읽어오는데...
$ su - user1
을 하거나, ssh로 접속을 시도할 때에 안 되는 경우가 있다.
특히 su 명령어로 로그인을 성공하는 순간 무려 segmentation fault가 뜨면서... 난감하다.
결론적으로 svcadm으로 NSCD 서비스를 켜면 해결된다.
# svcadm enable name-service-cache


끝. 즐거운 작업이 되길...