본문 바로가기
Container

Podman short-name 설정

일반적으로 docker 를 사용하여 container image 를 pull 하는 경우 아래와 같이 docker.io에 있는 정보를 확인 하여 container image 를 pull 하게 된다.

root@cyyoon-mgt:~# docker version
Client: Docker Engine - Community
 Version:           20.10.11
 API version:       1.41
 Go version:        go1.16.9
 //..
root@cyyoon-docker-os:~# docker pull nginx
Using default tag: latest
//..
Status: Downloaded newer image for nginx:latest

하지만, podman의 경우는 동일하게 pull 하게 된다면,  "short-name "nginx" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"" 에러를 받게 된다.

root@cy03-test240:~# podman  --version
podman version 3.4.4
root@cy03-test240:~# podman pull nginx
Error: short-name "nginx" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"

우선 이러한 이슈를 알기전 podman이 docker 와 다른 registry 설정 방향성을 갖고 있는 부분을 알아야 한다.

Unqualified-search-registries

unqualified-search-registries 설정은 직역해서 의미 그대로 정규화되지 않은(unqualified)  registry 들의  검색 이라고 나온다. 즉, qualified 의미는  "registry.redhat.io/ubi8/ubi:latest" 와 같이 registy의 전체 dns 이름과 namespace 그리고 image 이름과 태그를 포함한 형태를 사용한 방법을 의미 하며(가능하면 digest 포함하는 것도 더 좋은방법이라고 함 i.e ,quay.io/repository/name@digest ) ,

반대로 unqualified 경우는 앞서 qualified 에서 registry 의 전체 dns 이름등을 생략한 경우를 의미 한다. 그래서 이러한 unqualified-search-registries  리스트에 순서 대로 조회 하여 registry 에서 pull 하게 되는 것이다.  

만약,  unqualified-search-registries 설정이 아래와 같이 quay → docker  → private-registry 순으로 나열 되어 있다면 처음에 pull 하려고 했던 "podman pull nginx" 의 경우 quay → docker  → private-registry 순으로 각 registry 에 조회 하여 pull 하게 될 것이다.

root@cy03-test240:~#  cat /etc/containers/registries.conf
//...
unqualified-search-registries = ["quay.io","docker.io","private-registry"]
//...

하지만 이러한 경우 발생하는 문제점이 스푸핑될 가능성이 있다. 만약, foorbar 이미지를 pull 하는데 있어서 실제로는 private-registry 에 있지만,   unqualified-search-registries 의 순서처럼 quay → docker  → private-registry 순으로 조회 하는 중간 docker  에 동일한 이름의 foorbar 이미지를 다른 사용자가 사용 하여 문제점이 발생 하거나,

이러한  docker 에 push 한 사용자가 공격의 의미로 다른 의도의 코드를 삽입 했을 경우 보안 문제가 발생 할 수 있다. ( https://www.redhat.com/en/blog/be-careful-when-pulling-images-short-name)

그래서 이러한 ambiguity(모호성) 으로 인한 문제를 해결하고자, short-name 이라는 alias 와 같은 부분이 추가 되었으며, 그렇기 않으면 앞서 권고 한거와 같이 qualified 된 방법으로 search 하도록 이야기 하고 있다.

Podman registry alias 

podman 이 설치 되고 "/etc/containers/registries.conf.d/shortnames.conf" 파일을 확인하면, shortname에 해다여 alias 설정들을 확인할 수  있다.

root@cy03-test240:/etc# cat /etc/containers/registries.conf.d/shortnames.conf
[aliases]
  # almalinux
  "almalinux" = "docker.io/library/almalinux"
  "almalinux-minimal" = "docker.io/library/almalinux-minimal"
  # centos
  "centos" = "quay.io/centos/centos"
  # containers
  "skopeo" = "quay.io/skopeo/stable"
  "buildah" = "quay.io/buildah/stable"
  "podman" = "quay.io/podman/stable"
  # docker
  "alpine" = "docker.io/library/alpine"
  "docker" = "docker.io/library/docker"
  "registry" = "docker.io/library/registry"
  "hello-world" = "docker.io/library/hello-world"
  "swarm" = "docker.io/library/swarm"
  # Fedora
  "fedora-minimal" = "registry.fedoraproject.org/fedora-minimal"
  "fedora" = "registry.fedoraproject.org/fedora"
// ...

예를 들어 , "fedora" = "registry.fedoraproject.org/fedora" 이러한 설정이 위에 있는 환경에서 앞서 설정한 unqualified-search-registries 이 존재 하는 경우에 "podman pull fedora" 명령을 통하여 unqualified 된 형태로 pull 하는 경우 설정된 순서 순으로 조회 하여 pull 하겠지만, 

alias 설정이 우선 되어서,  "registry.fedoraproject.org/fedora" 라는 형태로 pull 하게 된다. 

root@cy03-test240:/etc# podman  pull fedora
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/shortnames.conf)   //<--- unqualified-search-registries 설정보다 먼저, shortnames.conf 파일에 정의된 alias 를 resolve 하게 된다.
Trying to pull registry.fedoraproject.org/fedora:latest...
Getting image source signatures
Copying blob de924d42b91d [==========>---------------------------] 20.7MiB / 70.1MiB
//...

그래서 만약 다양한 registry 를 사용 해서 unqualified-search-registries 를 설정한 경우 특정한 registry 에 특정한 image 를 신뢰 할수 있고 short name 형태로 사용 한다면 이러한 alias 설정을 진행 하는 것이 좋을 것이다.

Shrotname  Project 

containers 프로젝트에 있는 podman 과 함께 진행 중인 shortnames 에서 "https://github.com/containers/shortnames/blob/main/shortnames.conf" 파일을 통하여 short-name 목록을 수집하여 배포판으로 포함 하도록 여러 리눅스 배포판 프로젝트/회사 들이 참여  하고 있다.

실제 파일 목록을 확인하면 단순 podman 설치시 보다 많은 short-name 들을 확인할 수 있다. 이러한 배포판/회사 들이 참여 하여 업데이트 하는 이유는 대부분 배포판/회사들이 자체적인 registry 를 갖고 있거나,  형태 들이 다들 틀리고 많은 경우의 보안 문제가 container build 과정의 base image를 사용 하는 경우에  많이 발생해서 그런것으로 보인다.(개인생각) 

 

short-name-mode 

https://github.com/containers/image/blob/a15f831d869b59d363345102cd1c0fbf77817560/docs/containers-registries.conf.5.md?plain=1#L174

short-name-mode 는 상황에 맞게 "unqualified-search-registries" 설정에 따라서 registry 사용이 가능 하도록 해준다.  설정 자체는 selinux 와 유사하며 각 설정은 아래와 같다.

  • enforcing: If no matching alias is found during the image pull, Podman prompts the user to choose one of the unqualified-search registries. If the selected image is pulled successfully, Podman automatically records a new short-name alias in the $HOME/.cache/containers/short-name-aliases.conf file (rootless user) or in the /var/cache/containers/short-name-aliases.conf (root user). If the user cannot be prompted (for example, stdin or stdout are not a TTY), Podman fails. Note that the short-name-aliases.conf file has precedence over the registries.conf file if both specify the same alias.
  • permissive: Similar to enforcing mode, but Podman does not fail if the user cannot be prompted. Instead, Podman searches in all unqualified-search registries in the given order. Note that no alias is recorded.
  • disabled: All unqualified-search registries are tried in a given order, no alias is recorded.

    https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/building_running_and_managing_containers/index#con_configuring-short-name-aliases_working-with-container-registries

 

enforcing mode 가 기본 이며, tty 가 활성화 된 상태에서 pull/push 등 registry 를 사용할 경우 unqualified-search-registries 에 등록된 registry 를 선택 하여 사용 되며, 한번 등록된 alias 는 cache 로 저장 된다.

만약 , tty 를 사용할 수 없다면 실패로 되며, build 과정등 과 같이 tty이 없는 환경에서 주로 에러가 발생 한다. 이상태에서 tty 없이

// enforcing mode 에서 4개의 registry 가 있음
root@cy03-test241:~# egrep -v '^#|^$' /etc/containers/registries.conf
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "docker.io", "quay.io"]
short-name-mode="enforcing"
 
// tty 로 선택 가능해짐 docker.io 로 선택
root@cy03-test241:~# podman pull nginx
? Please select an image:
    registry.fedoraproject.org/nginx:latest
    registry.access.redhat.com/nginx:latest
    docker.io/library/nginx:latest
  ▸ quay.io/nginx:latest
 
// docker.io 에서 pull
root@cy03-test241:~# podman pull nginx
✔ docker.io/library/nginx:latest
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 831f51541d38 done
Copying blob eed12bbd6494 done
Copying blob f03b40093957 done
Copying blob 7ff3b2b12318 done
Copying blob fa7eb8c8eee8 done
Copying blob 0f67c7de5f2c done
Copying config f9c14fe76d done
Writing manifest to image destination
 
//"/var/cache/containers/short-name-aliases.conf" 에 자동으로 alias 설정 되어 재사용 하게 됨
root@cy03-test241:~# cat /var/cache/containers/short-name-aliases.conf
[aliases]
  nginx = "docker.io/library/nginx"
root@cy03-test241:~# podman  images | grep nginx
docker.io/library/nginx     latest      f9c14fe76d50  3 days ago   147 MB
root@cy03-test241:~# podman  rmi nginx
Untagged: docker.io/library/nginx:latest
Deleted: f9c14fe76d502861ba0939bc3189e642c02e257f06f4c0214b1f8ca329326cda
root@cy03-test241:~# podman  pull nginx
Resolved "nginx" as an alias (/var/cache/containers/short-name-aliases.conf)
Trying to pull docker.io/library/nginx:latest...

disabled mode 로 설정할 경우 unqualified-search-registries 에 나온 registry 순서로 검색하여 사용 하며, 별도로 cache 를 남기지 않는다.

// disabled mode 에서 4개의 registry 가 있음
root@cy03-test241:~# egrep -v '^#|^$' /etc/containers/registries.conf
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "docker.io", "quay.io"]
short-name-mode="disabled"
 
root@cy03-test241:~# podman  pull nginx
Resolving "nginx" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull registry.fedoraproject.org/nginx:latest...
Trying to pull registry.access.redhat.com/nginx:latest...
WARN[0002] Failed, retrying in 1s ... (1/3). Error: initializing source docker://registry.access.redhat.com/nginx:latest: reading manifest latest in registry.access.redhat.com/nginx: unknown: Not Found
WARN[0003] Failed, retrying in 1s ... (2/3). Error: initializing source docker://registry.access.redhat.com/nginx:latest: reading manifest latest in registry.access.redhat.com/nginx: unknown: Not Found
WARN[0004] Failed, retrying in 1s ... (3/3). Error: initializing source docker://registry.access.redhat.com/nginx:latest: reading manifest latest in registry.access.redhat.com/nginx: unknown: Not Found
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 831f51541d38 done
Copying blob 0f67c7de5f2c done
Copying blob f03b40093957 done
Copying blob 7ff3b2b12318 done
Copying blob fa7eb8c8eee8 done
Copying blob eed12bbd6494 done
Copying config f9c14fe76d done
Writing manifest to image destination
Storing signatures
f9c14fe76d502861ba0939bc3189e642c02e257f06f4c0214b1f8ca329326cda
root@cy03-test241:~# ls -al /var/cache/containers/
total 8
drwx------  2 root root 4096 May 28 20:30 .
drwxr-xr-x 13 root root 4096 May 28 20:21 ..
-rw-r--r--  1 root root    0 May 28 20:21 short-name-aliases.conf.lock

Summary

  • docker cli 는 docker.io 라는 public registry를 기반으로 upstream container image 를 pull 하거나,  별도의 registry 경우 전체 url을 통하여 container image 를 pull 할 수 있다.
  • 하지만,  containers 프로젝트 기반의 podman 은 다양한 registry 를 사용하도록 되어 있다. 그러나, 이러한 부분으로 spoofing 과 같은 보안 이슈가 생기기 때문에 , short-name 설정을 통하여 보안하고자 한다. 
  • 가장 좋은 방법은 image url 전체를 사용 하는 방법이겠지만, 편의성 이나 다른 이유로 대부분 github 등에 있는 다양한 오픈소스에 있는 yaml 파일들을 사용하다 보면 docker 기반으로 작성된 부분이 많기 때문에 이러한 보안 이슈가 생길 가능성이 높다. 

Reference

반응형

'Container' 카테고리의 다른 글

Podman Rootless Container 의 PID/User Namespace  (0) 2024.02.15