LXC 컨테이너 내부 및 외부의 사용자 권한?


26

내 서버의 Docker LXC 컨테이너 내부에서 일부 서비스를 실행 중이며 실제로 심각한 작업을 시작하고 있습니다.

분명하지 않은 한 가지는 컨테이너 내부와 외부에서 사용자 권한이 작동하는 방식입니다. 예를 들어 컨테이너에서 MySQL을 실행 중이고 데이터 디렉토리 /data가 Docker 볼륨 인으로 설정된 경우 컨테이너 내부 및 외부의 권한이 액세스 정책에 어떤 영향을 미칩니 까?

분명히 아이디어는 컨테이너에서 자신의 사용자로 MySQL을 실행 mysql:mysql하고 해당 디렉토리에 대한 읽기 및 쓰기 권한을 부여하는 것입니다. chmod디렉토리 등을 사용하는 것이 매우 간단하다고 가정합니다 . 그러나 컨테이너 외부 에서 어떻게 작동 합니까? 이제 'data'라는이 Docker 공유 볼륨이 있으므로 액세스 제어를 어떻게 관리합니까?

특히 Docker 컨테이너 외부 에서 권한이없는 사용자를 실행하여 주기적으로 MySQL 공유 볼륨에 액세스하고 데이터를 백업 할 수 있기를 바랍니다.

호스트의 특정 사용자가 Docker 공유 볼륨의 파일 및 폴더를 읽고 쓸 수 있도록 권한, 사용자 및 그룹을 어떻게 설정합니까?


2
함께 userns (하지만 docker아직 지원 등) LXC 컨테이너는 권한이없는 사용자로 실행할 수 있습니다. 그렇지 않으면 root컨테이너가 잘못 구성된 경우 컨테이너 내부 의 사용자가 잠재적으로 문제를 일으킬 수 있습니다. root호스트의 즉 root, 특권 LXC 컨테이너의 컨테이너에 있습니다.
0xC0000022L

1
root그건 그렇고, 권한이없는 컨테이너를 실행할 수도 있습니다 . 사용자에 대한 매핑 이 정의 되어 있어야 합니다.
0xC0000022L

답변:


21

0.9의 출시 이후 Docker는 LXC자체 실행 환경을 삭제 하고 사용합니다 libcontainer. 귀하의 질문이 약간 오래되었지만 내 대답이 여전히 사용중인 버전에 적용되는 것 같습니다.

빠른 답변 : 볼륨의 권한을 이해하기 위해의 비유를 할 수 있습니다 mount --bind Host-Dir Container-Dir. 따라서 요구 사항을 충족하기 위해 기존의 권한 관리 방법을 사용할 수 있습니다. ACL이 필요한 것 같아요 .

긴 답변 : 그래서 당신의 예에서와 같이 우리는 용기라는 이름의이 도크 볼륨과를 /data.

docker run -tid --name dock -v /usr/container/Databases/:/data \
    centos:latest /bin/bash

컨테이너 내부에서 MySQL 서버는 /data데이터 디렉토리로 사용하도록 구성되었습니다 . 따라서 /data컨테이너 내부에 데이터베이스가 있습니다 . 그리고 호스트 OS의 컨테이너 외부에서이 /data볼륨을 마운트 /usr/container/Databases/했으며 일반 사용자 을 할당 하여 데이터베이스 백업을 수행합니다. 호스트 머신에서 사용자 bob에 대한 ACL을 구성합니다 .

useradd -u 3000 bob
usermod -R o=--- /usr/container/Databases/
setfacl -R -m u:bob:rwx /usr/container/Databases/
setfacl -R -d -m u:bob:rwx /usr/container/Databases/

그것을 테스트하려면 사용자 bob 으로 백업하십시오 .

su - bob
tar -cvf container-data.tar /usr/container/Databases/

그리고 tar가 나열되고 사용자가 모든 파일에 액세스 할 수 있음을 알 수 있습니다.

이제 컨테이너 내부에서 bobgetfacl 대신 3000 을 표시한다는 것을 알 수 있습니다. 이는 bob의 UID가 3000이고 컨테이너에 해당 사용자가 없기 때문에 메타 데이터에서 수신하는 UID를 표시하기 때문입니다. . 이제 컨테이너에서 사용자를 생성하면 3000 대신 bob이라는 이름 이 표시됩니다.useradd -u 3000 bobgetfacl

요약 : 컨테이너 내부 또는 외부에서 할당 한 사용자 권한은 두 환경 모두에 반영됩니다. 따라서 볼륨의 권한을 관리하려면 호스트 시스템의 UID가 컨테이너의 UID와 달라야합니다 .


Ubuntu 용 Docker는 최소한 패키지 이름이 lxc-dockerLXC를 사용하지 않는다는 의미입니까? 이 경우에도 위의 내용이 계속 적용됩니까?
Naftuli Kay

@NaftuliTzviKay 아 죄송합니다. apt-get info우분투에는 docker.io내가 사용한 다른 패키지가 있기 때문에 LXC ( 세부 사항이있을 수 있습니다)를 사용해야합니다. Docker와 RedHat이 손을 잡았으므로 우분투와 오랫동안 가지 않았습니다. 따라서 RHEL 또는 CentOS를 기본 OS로 사용하는 것이 좋습니다. 그렇지 않으면 LXC를 간단히 사용할 수 있습니다.
초보자

이것조차도 lxc-docker계획대로 작동하는 것 같습니다. uid가 3000 인 사용자를 만들고 공유 볼륨에있는 파일을 만졌으며 호스트 OS에서 파일이 존재하고 ID가 3000 인 사용자가 소유하고 있음을 알 수있었습니다.
Naftuli Kay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.