사용자를 사용할 때(내 경우에는 LXC를 통해) 권한이 없는 사용자에게 일련의 하위 GID 및 UID를 할당합니다. 리소스 보기:subuid(5)
,subgid(5)
,newuidmap(1)
,newgidmap(1)
,user_namespaces(7)
.
그런 다음 범위를 사용할 수 있으며 전달됩니다.사용자 이름시스템 계정에 매핑합니다.
john
UID(및 GID) 1000을 가진 (호스트) 시스템 계정이 있다고 가정합니다 . 할당된 GID 및 UID 범위는 100000..165536입니다.
/etc/subgid
따라서 및 각각에 대한 항목이 있습니다 /etc/subuid
.
john:100000:65536
권한이 없는 컨테이너 내에서 "내부"가 소유한 파일은 john
이제 호스트에서 101000이 소유하고 "내부"가 소유한 파일은 root
100000이 소유하게 됩니다.
일반적으로 이러한 범위는 호스트의 어떤 이름에도 할당되지 않습니다.
질문:
ls
친구에게 더 의미 있는 출력을 제공하기 위해 호스트 시스템에서 이러한 각 UID/GID에 대한 사용자를 생성할 수 있습니까 ?john
사용자를 "소유"하는 호스트 사용자(예: 우리의 경우) 가 이러한 파일/폴더에 액세스할 수 있도록 하는 방법이 있습니까 ? 그렇다면 하위 범위의 유효 사용자와 사용자의 "소유자" 간에 공유되는 그룹을 만들고 그에 따라 권한을 설정하는 것이 유일한 합리적인 접근 방식입니까? 음, 분명히 ACL입니다.
답변1
- ls와 친구들에게 더 의미 있는 출력을 제공하기 위해 해당 UID/GID에 대해 호스트 시스템에서 사용자를 생성할 수 있습니까?
네, 괜찮아요. 그러나 해당 사용자가 호스트 시스템의 어떤 항목에도 권한이 없는지 확인해야 합니다.
- 액세스 또는 비밀번호 비활성화,
- 사용 가능한 로그인 쉘이 없습니다.
- 쓰기 가능한 홈 디렉토리가 없습니다.
또한 사용자 이름이 중복되지 않도록 주의하세요.
/etc/passwd
다음은 게스트 와 /etc/group
파일을 사용하여 호스트 시스템에서 적절한 사용자를 생성하는 샘플 스크립트입니다 . 모든 이름에는 컨테이너 이름이 접두어로 붙고 모든 ID는 컨테이너의 UID와 일치하도록 지정된 값으로 증가됩니다.
#! /bin/sh
# Path to guest's `/etc' directory.
guest_etc=/var/lib/lxc/mycontainer/rootfs/etc
# Guest's name, used as login prefix and inside GECOS field.
guest_name=mycontainer
# Increment to be applied to UIDs and GIDs (= range start).
uid_incr=100000
gid_incr=$uid_incr
guest_passwd=${guest_etc}/passwd
guest_group=${guest_etc}/group
exec <$guest_group
while IFS=":" read name pass gid null; do
gid_new=$( expr $gid + $gid_incr )
if ! getent group $gid_new >/dev/null; then
addgroup --system --gid $gid_new "${guest_name}_${name}"
fi
done
exec <$guest_passwd
while IFS=":" read login pass uid gid gecos null; do
uid_new=$( expr $uid + $uid_incr )
gid_new=$( expr $gid + $gid_incr )
if ! getent passwd $uid_new >/dev/null; then
adduser --system --home /nonexistent --no-create-home \
--shell /bin/nologin --uid $uid_new --gid $gid_new \
--gecos "\"$guest_name container user (${gecos})\"" \
"${guest_name}_${login}"
fi
done
액세스할 수 없는 홈 디렉토리에 대한 경고는 정상적이고 예상되는 것입니다. 이는 /nonexistent
실제 목적이 아닙니다.
- 사용자를 "소유"하는 호스트 사용자(예: 이 예에서는 John)가 이러한 파일/폴더에 액세스할 수 있도록 하는 방법이 있습니까? 그렇다면 하위 범위의 유효 사용자와 사용자의 "소유자" 간에 공유되는 그룹을 만들고 이에 따라 권한을 설정하는 것이 유일한 합리적인 접근 방식입니까? 음, 분명히 ACL입니다.
내 생각에는 이것은 그 자체로 질문을 받을 가치가 있다.
컨테이너의 콘텐츠는 컨테이너 소유자의 UID와 다른 UID가 소유하므로 콘텐츠에 액세스할 수 없습니다. 하위 사용자에 대한 이 규칙에 예외가 있다고 상상할 수 있지만 현재는 모르겠습니다.관련된 질문시간이 좀 지났는데 아직 답변이 없네요.)
파일 /etc/subuid
이며 현재 특정 프로세스가 하나의 UID/GID에서 다른 UID/GID로 전환하는 것을 허용하거나 거부하기 위해 /etc/subgid
(1)에서만 사용됩니다 . newuidmap
목장 주인에게 다른 권리를 부여하지 않습니다.
따라서 솔루션은 사례별로 설계되어야 합니다. 그러나 ACL 아이디어에 주의하세요. 호스트의 UID 1000이 읽을 수 있도록 컨테이너의 파일에 일부 ACL을 배치한다고 가정하면 이는 컨테이너의 UID 1000의 컨테이너 사용자도 동일한 수준의 권한을 갖게 된다는 것을 의미합니다.