Linux/Virtualization2009/05/19 18:02
접근 제어

libvirt에 접속할때 어떠한 연결들은 API 사용전에 클라이언트의 인증을 요구할 수 도 있다. 가능한 인증 메카니즘의 집합은 libvirt를 사용하는 어플리케이션에 상관없이 관리자가 제어한다.

- 서버 설정
- 유닉스 소켓 퍼미션/그룹
- 유닉스 소켓 PolicyKit auth
- 사용자이름/패스워드 auth
- Kerberos auth

서버 설정

libvirt 데몬은 각 네트웍 소켓에 독립적으로 클라이언트 연결에 대해서 사용할 인증 메카니즘을 관리자가 선택할 수 있도록 허용한다. 이것은 기본적으로 libvirt 데몬에 대한 마스터 설정 파일인 /etc/libvirt/libvirtd.conf 를 통해서 이루어진다. 각 libvirt 소켓은 독립적으로 설정된 자신의 인증 메카니즘을 가질수 있다. 현재 none, polkit, sasl 중에서 고를 수 있다. SASL 스킴은 다시 다양한 메카니즘중에서 고를 수 있게 되어 있다.

유닉스 소켓 퍼미션/그룹

만약 libvirt가 PolicyKit에 대한 지원을 가지고 있다면 더 나은 접근 제어 선택을 할 수 있다. unix_sock_auth 인자는 polkit에 대한 기본 값이 되며 파일 퍼미션은 0777이 기본값이 된다 (RW  소켓도 마찬가지이다). 소켓에 연결된 후에 클라이언트 어플리케이션은 자기 자신을 PolicyKit을 통해 식별할 필요가 있을 것이다. RW 데몬 소켓에 대한 기본 정책은 현재 데스크탑 세션에서 수행중인 어떠한 어플리케이션이든 유저의 비밀번호를 사용해서 인증할 필요가 있다. sudo auth에서도 비슷하지만 클라이언트 어플리케이션이 결과적으로 root로 수행될 필요는 없다. 기본 정책은 어떠한 어플리케이션이든 RO 소켓에는 연결할 수 있도록 허용한다.

기본 정책은 관리자에 의해 PolicyKit 마스터 설정 파일인 /etc/PolicyKit/PolicyKit.conf 파일을 통해 바꿀 수 있다. PolicyKit.conf(5) 매뉴얼 페이지는 가능한 문법들에 대해서 제공한다. 사용 가능한 두가지 libvirt 데몬 액션으로 읽기전용 소켓에는 org.libvirt.unix.monitor가 있으면  읽기쓰기 소켓에는 org.libvirt.unix.manage가 있다.

예를 들어, 읽기쓰기 소켓에 대해서 joe는 관리자 비밀번호가 있어야 하지만 fred가는 완전한 접근을 할 수 있도록 하자면 다음 내용을 PolicyKit.conf 에 추가할 필요가 있다.

 <match action="org.libvirt.unix.manage">
    <match user="fred">
      <return result="yes"/>
    </match>
  </match>
  <match action="org.libvirt.unix.manage">
    <match user="joe">
      <return result="auth_admin"/>
    </match>
  </match>
Username/Password auth

libvirt 데몬에 대한 평범한 TCP 소켓은 인증에 대해서 기본값으로 SASL을 사용하도록 되어 있다. 기본으로 설정되어 있는 SASL 메카니즘은 DIGEST-MD5으로서 기본적인 사용자이름+비밀번호 형태의 인증을 제공한다. 이것은 또한 자료 흐름의 암호화를 제공하기 때문에 평범한 TCP 소켓의 보안이 TLS소켓과 비슷한 수준이 될 수 있다. 원한다면 유닉스 소켓과 TLS 소켓도 libvirt.conf 의 auth_unix_ro, auth_unix_rw, auth_tls 설정 인자들을 통해서 SASL를 가능하게 할 수 있다.

처음에는 어떠한 사용자 계정도 정의되어 있지 않으며 따라서 어떠한 클라이언트도 TCP 소켓을 통해서 인증될 수 없다. 사용자를 추가하고 패스워드를 설정하는 것은 saslpasswd2 명령을 통해서 수행된다. 이 명령을 수행할 때 appname이 libvirt라는 것을 꼭 알려줘야 한다. 예를 들어, fred라는 계정을 추가하기 위해서는 다음 명령을 수행해라.
# saslpasswd2 -a libvirt fred
Password: xxxxxx
Again (for verification): xxxxxx
모든 계정 리스트를 보고자 한다면 sasldblistusers2 명령을 사용하면 된다. 이 명령은 libvirt 사용자 데이타베이스에 대한 경로를 줄 것을 기대하며 이것은 /etc/libvirt/passwd.db 파일이다.
# sasldblistusers2 -f /etc/libvirt/passwd.db
fred@t60wlan.home.berrange.com: userPassword
마지막으로, 사용자의 접근을 비활성화하기 위해서는 saslpasswd2 명령을 다시 사용하면 된다.
# saslpasswd2 -a libvirt -d fred

Kerberos auth

libvirt 데몬이 사용하는 일반 TCP 소켓은 인증을 위해 SASL을 기본값으로 사용한다. 기본으로 설정되어 있는 SASL 메카니즘은 DIGEST-MD5로서 사용자이름+비밀번호 형태의 인증을 제공한다. 대신에 kerberos 싱글사인온(signle-sign-on)을 사용하고자 한다면 libvirt SASL 설정 파일이 바뀌어야만 한다. 이 파일은 /etc/sasl2/libvirt.conf 이다. mech_list 인자가 기본값인 digest-md5 대신에 gssapi로 바뀌어야 한다. 만약 SASL이 유닉스나 TLS 소켓에서 활성화되어 있다면 Kerberos가 이들을 위해서도 사용될 수 있다. DIGEST-MD5처럼 Kerberos 메카니즘도 이 세션에 대해서 자료 암호화를 제공한다.

몇몇 운영체제제는 SASL Kerberos 플러그인을 기본으로 설치하지 않는다. 하위 패키지인 cyrus-sasl-gssapi 를 설치할 필요가 있을수도 있다. Kerberos 플러그인이 설치되어 있는지 확인하기 위해서는 pluginviewer 프로그램을 실행해서 리스트에 gssapi가 있는지 검사해라. 즉.
# pluginviewer
...snip...
Plugin "gssapiv2" [loaded],     API version: 4
        SASL mechanism: GSSAPI, best SSF: 56
        security flags: NO_ANONYMOUS|NO_PLAINTEXT|NO_ACTIVE|PASS_CREDENTIALS|MUTUAL_AUTH
        features: WANT_CLIENT_FIRST|PROXY_AUTHENTICATION|NEED_SERVER_FQDN

다음은 libvirt 서버를 위해 원칙을 생성하기 위한 Kerberos 영역에서의 관리자를 위해 필요한것이다. 이것은 libvirt 데몬을 수행하는 호스트당 하나의 원칙이 필요할 수 있다. 원칙(principle)은 libvirt/full.hostname@KERBEROS.REALM 형태로 이름 붙어야 한다. 이것은 일반적으로 Kerberos 서버상에서 kadmin.local 명령을 수행함으로써 이루어진다. 하지만 몇몇 Kerberos 서버들은 서비스 원칙 (principles)을 설정하는 다른 방법들을 가지고 있다. 한번 만들어지면, 원칙(principle)은 keytab에 export되어야 하며 libvirt 데몬이 수행중인 호스트로 복사되어야 하고 /etc/libvirt/krb5.tab에 놓여야 한다.
# kadmin.local
kadmin.local: add_principal libvirt/foo.example.com
Enter password for principal "libvirt/foo.example.com@EXAMPLE.COM":
Re-enter password for principal "libvirt/foo.example.com@EXAMPLE.COM":
Principal "libvirt/foo.example.com@EXAMPLE.COM" created.

kadmin.local:  ktadd -k /root/libvirt-foo-example.tab libvirt/foo.example.com@EXAMPLE.COM
Entry for principal libvirt/foo.example.com@EXAMPLE.COM with kvno 4, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/root/libvirt-foo-example.tab.
Entry for principal libvirt/foo.example.com@EXAMPLE.COM with kvno 4, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/root/libvirt-foo-example.tab.
Entry for principal libvirt/foo.example.com@EXAMPLE.COM with kvno 4, encryption type DES with HMAC/sha1 added to keytab WRFILE:/root/libvirt-foo-example.tab.
Entry for principal libvirt/foo.example.com@EXAMPLE.COM with kvno 4, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/root/libvirt-foo-example.tab.

kadmin.local: quit

# scp /root/libvirt-foo-example.tab root@foo.example.com:/etc/libvirt/krb5.tab
# rm /root/libvirt-foo-example.tab
kerberos가 활성화되어 있는 libvirt 서버에 연결하기를 원하는 어떠한 클라이언트 어플리케이션이든 사용자 원칙(principle)을 획득하기 위해 단지 kinit를 수행할 필요가 있다. 만약 PAM이 Kerberos를 통해 인증하도록 되어 있다면 사용자가 데스크탑 세션으로 로그인할 때 자동으로 이루어진다.

=================
헥헥.. 번역하기 힘들다.
한동안은 KVM 번역을 먼저 해야 할 것 같습니다..... libvirt는 조만간에 다시...
크리에이티브 커먼즈 라이선스
Creative Commons License

'Linux > Virtualization' 카테고리의 다른 글

libvirt.org - 인증 (Authentication)  (0) 2009/05/19
원격 접속  (0) 2009/05/15
URI 포맷  (0) 2009/05/14
libvirt 배포  (0) 2009/05/12
The Virtualization API  (0) 2009/05/11
가상화가 대세  (0) 2009/05/11
Posted by 리뜨
TAG