User Namespace(2)
Interaction of user namespaces and other types of namespaces
User 네임스페이스는 다른 네임스페이스들과 연관관계를 맺고있습니다.
리눅스 커널 3.8부터 권한이 없는(unprivileged) 프로세스들도 User 네임스페이스를 생성할 수 있습니다. 프로세스가 CAP_SYS_ADMIN Capability 를 가지고 있다면 Mount, PID, IPC, Network, UTS 네임스페이스도 생성할 수 있습니다.
Non-user 네임스페이스(User 네임스페이스를 제외한 다른 네임스페이스)가 생성될 때 새로운 프로세스는 자신을 생성한 프로세스가 속한 User 네임스페이스에 속하게 됩니다. Non-user 네임스페이스은 User 네임스페이스의 기능이 필요합니다. 만약 * clone(2) ** 또는 ** unshare(2) ** 호출 시 ** CLONE_NEWUSER ** 가 다른 ** CLONE_NEW\ ** 플래그와 함께 명시된다면 User 네임페이스를 먼저 생성하게 됩니다. 그 이후 권한을 확인하여 나머지 네임스페이스의 생성을 하게 됩니다. 따라서 권한이 없는 호출 프로세스는 이와 같은 플래그의 조합으로 시스템 콜을 호출할 수 있습니다.
새로운 IPC, mount, network, PID, UTS 네임스페이스가 ** clone(2) ** 또는 *unshare(2) * 시스템 콜을 통해 생성되면 커널은 새로운 네임스페이스에 대해 생성되는 프로세스의 사용자 네임스페이스를 기록합니다. 새로운 네임스페이스의 프로세스가 네임스페이스 격리된 전역 리소스에서 동작하는 권한이 필요한 작업을 연속적으로 수행하면 커널이 새로운 네임스페이스와 연결된 User 네임스페이스의 새로운 프로세스 기능에 따라 권한을 검사하게 됩니다.
User 네임스페이스는 다른 네임스페이스들과 연관관계를 맺고 있는 부분을 확인 할 수 있으며, 특권(Capability)와 권한(Privilege)에 대한 관계도 관련이 있음을 알 수 있습니다.
User and Group ID mapplings : uid_map and gid_map
User 네임스페이스가 생성되면 상위 User 네임스페이스에 User, Group ID가 매핑되지 않고 시작합니다.
** /proc/[pid]/uid_map ** 과 ** /proc/[pid]/gid_map ** 파일은 해당 프로세스의 User 네임스페이스 내부의 사용자와 그룹 ID 매핑 정보를 보여줍니다. 이 정보는 Namespace(1) 글에서 자료구조 내부적으로 어떻게 관리하는지 본 적이 있습니다.
55 struct user_namespace {
56 struct uid_gid_map uid_map;
57 struct uid_gid_map gid_map;
58 struct uid_gid_map projid_map;
59 atomic_t count;
60 struct user_namespace *parent;
61 int level;
62 kuid_t owner;
63 kgid_t group;
64 struct ns_common ns;
65 unsigned long flags;
66
67 /* Register of per-UID persistent keyrings for this namespace */
68 #ifdef CONFIG_PERSISTENT_KEYRINGS
69 struct key *persistent_keyring_register;
70 struct rw_semaphore persistent_keyring_register_sem;
71 #endif
72 struct work_struct work;
73 #ifdef CONFIG_SYSCTL
74 struct ctl_table_set set;
75 struct ctl_table_header *sysctls;
76 #endif
77 struct ucounts *ucounts;
78 int ucount_max[UCOUNT_COUNTS];
79 } __randomize_layout;
위 구조체에서 uid_map, gid_map이 구조체의 멤버로 존재하며, user_namespace 구조체 내부에서 관리하고 있음을 알 수 있습니다.
'Linux > Container' 카테고리의 다른 글
5. Mount namespace (0) | 2019.08.05 |
---|---|
[QEMU] Introduction (0) | 2019.07.01 |
[QEMU] virt-install flag (0) | 2019.06.17 |
User Namespace(1) (1) | 2019.05.08 |
PID Namespace (0) | 2019.05.03 |