환경 변수 파일을 docker가 읽지 못하는 트러블 슈팅 기록

chan·2023년 12월 17일
1

발단

기존에 배포 파일에 포함되어 있던 환경 변수 파일을 인스턴스 서버에 저장 후,

docker run -d \
    --env-file /root/.env.production \

이렇게 실행하려 했더니,

err: docker: open /***/.env.production: permission denied.

이런 에러가 발생했다. 따라서, 권한을 chmod 755로 주어, 도커 애플리캐이션이 읽을 수 있게 변경하였다. 하지만, 여전히 권한이 없다는 에러가 나왔다.

원인

원인을 찾아본 결과,

https://fusionauth.io/community/forum/topic/683/trying-to-install-into-docker-but-getting-permission-error

이 사이트에서 원인을 찾을 수 있었고, 원인은 처음에 도커를 snap install docker로 깔았던 것이 문제였다. 왜 snap으로 설치한 도커는, 환경 변수 파일을 읽지 못하는가? 스냅 패키지 개발자는 스냅 격리를 철저하게 처리하는 것이 간단하지 않기에, 다양한 권한 관련 문제가 자주 발생한다고 한다. 스냅 패키지 권한을 조정하거나 전통적인 방식으로 docker를 설치해야 한다고 한다.

스냅이란 무엇이고, snap 격리란 무엇인가. 그리고 왜 snap으로 설치된 소프트웨어가 파일을 읽을 때 권한 문제가 발생하는가?

그렇다면 스냅 격리는 무엇이기에, 이것을 잘 처리하지 않으면 권한 관련 문제가 발생하는가? 다시, snap은 또 무엇인가? 이럴때 사용하라고 있는 chatgpt에게 물어보았다.

Snap이란 무엇인가?

Snap은 Canonical에서 개발한 Linux에서 사용되는 소프트웨어 패키징 및 배포 포맷입니다. 이는 응용 프로그램과 그 의존성, 라이브러리 등을 격리된 환경에 포함하여 패키지화하는 방식을 제공합니다. Snap 패키지는 특정 배포판에 종속되지 않으며, 여러 Linux 배포판에서 실행될 수 있도록 설계되었습니다.

Snap 격리는 무엇인가?

Snap 패키지는 기본적으로 응용 프로그램을 컨테이너와 유사한 환경에 격리하여 실행합니다. 이는 응용 프로그램이 시스템에 미치는 영향을 최소화하고 응용 프로그램 간의 간섭을 방지합니다. 격리는 다음과 같은 주요 측면을 포함합니다:

  1. 패키지 완결성: 모든 필요한 파일 및 라이브러리는 패키지에 포함되어 있으므로 완결성이 유지됩니다.

  2. 컨테이너 기술 사용: Snap은 컨테이너 기술을 사용하여 응용 프로그램을 격리된 환경에서 실행합니다. 이는 AppArmor, seccomp 등과 같은 리눅스 커널 보안 모듈을 활용합니다.

  3. Cross-distribution 지원: 동일한 Snap 패키지는 여러 Linux 배포판에서 동일하게 작동할 수 있습니다.

Snap 격리를 처리하지 못할 때의 문제:

Snap 격리가 제대로 처리되지 않으면 다음과 같은 문제가 발생할 수 있습니다:

  1. 권한 문제: Snap은 AppArmor와 같은 보안 모듈을 사용하여 프로세스의 권한을 제한합니다. 제대로 격리되지 않으면 응용 프로그램이 시스템의 다른 부분에 액세스할 수 있으며 이는 보안 문제로 이어질 수 있습니다.

  2. 간섭 및 충돌: 격리가 부족하면 응용 프로그램이 다른 응용 프로그램이나 시스템 자원에 영향을 미칠 수 있습니다. 이는 예기치 않은 동작이나 충돌을 초래할 수 있습니다.

  3. 의존성 충돌: 격리가 제대로 이루어지지 않으면 Snap이 시스템에 설치된 패키지 및 라이브러리와 충돌할 수 있습니다.

따라서 Snap 격리를 제대로 처리하지 않으면 보안 문제와 시스템 안정성에 영향을 미칠 수 있습니다. 격리는 응용 프로그램이 필요한 권한과 자원에만 액세스할 수 있도록 보장하는 데 중요한 역할을 합니다.

정리

읽고, 정리해보자면 snap은 마치 docker 컨테이너와 비슷한 환경에서 소프트웨어를 패키징하고 배포하는 도구이다. 즉, 도커 컨테이너가 배포하듯이, 격리된 환경에서 프로그의 의존성을 설치하고 실행하여 운용되는 리눅스의 버전과 상관없이 소프트웨어를 실행시키게 도와주는 도구라고 생각하면 된다. 따라서, snap으로 실행된 소프트웨어는, 컨테이너와 같은 격리된 환경에서 실행되는 것과 같으며, 그 컨테이너는 AppArmor와 같은 보안 모듈에 의해 권한이 제한된다. 따라서, 외부에 있는 파일을 읽고 쓰는 것에 있어서 권한 문제가 발생할 수 있는 것이다.

부가적인 정보

여기서 AppArmor라는 보안 모듈이 무엇인지 궁금해져서 다시 chatgpt에게 물어보았다.

AppArmor(Application Armor)는 리눅스 시스템에서 응용 프로그램을 보호하는 커널 수준의 보안 모듈 중 하나입니다. AppArmor는 응용 프로그램이 특정 파일, 디렉토리, 또는 기타 시스템 리소스에 대한 액세스 권한을 강화하고 제한하여 시스템 보안을 향상시키는 데 사용됩니다.

AppArmor는 다음과 같은 주요 특징을 갖습니다:

  1. 프로파일링(Profile-based): AppArmor는 프로파일이라고 불리는 보안 규칙 세트를 사용하여 응용 프로그램의 동작을 제한합니다. 이 프로파일은 응용 프로그램이 특정 리소스에 대한 액세스 권한을 어떻게 갖게 될지를 정의합니다.

  2. 컨텍스트 기반 규칙: AppArmor 규칙은 응용 프로그램의 행동을 정의하기 위해 파일 경로, 소켓, 표준 입력 및 출력과 같은 여러 컨텍스트를 사용합니다. 이는 응용 프로그램이 특정 파일이나 네트워크 리소스에만 액세스할 수 있도록 하는 등 세밀한 제어를 제공합니다.

  3. 유연한 설정: AppArmor 규칙은 시스템 관리자가 정의하고 수정할 수 있으며, 이는 시스템 및 응용 프로그램의 요구에 따라 조정될 수 있습니다.

  4. 실행 시 동적 프로파일 교체: AppArmor는 실행 중인 응용 프로그램에 대해 프로파일을 동적으로 교체할 수 있습니다. 이는 응용 프로그램의 상태나 환경에 따라 보안 규칙을 실시간으로 조정할 수 있게 해줍니다.

AppArmor는 Ubuntu와 openSUSE 등의 리눅스 배포판에서 기본으로 사용되며, 컨테이너 기술과 함께 사용되어 응용 프로그램의 격리 및 보안을 강화하는 데 기여합니다.

문제 해결

자, 문제를 이제 알았으니, 해결해보자.

우선 snap으로 설치된 docker를 제거해야 한다.

snap remove docker로 docker를 서버 인스턴스에서 제거해주었다.

이제, apt로 docker를 설치해주자. 우선 우분투 시스템 패키지를 업데이트 해야한다.

sudo apt-get update

그 다음, 필요한 패키지를 설치해주자.

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

그리고, Docker의 공식 GPG키를 추가한다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker의 공식 apt 저장소를 추가해주자.

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

그다음 도커를 설치하면 된다.

sudo apt-get install docker-ce docker-ce-cli containerd.io

그리고 잘 설치가 되었는지

systemctl status docker로 확인해보면 된다. 정상 작동 됨을 볼 수 있다.

부가적인 정보

다시, GPG 키가 무엇이고, 왜 Docker 공식 저장소를 추가한 다음 설치하는 번잡한 과정을 거치는지 궁금해졌다. chatgpt에게 물어보았다.

GPG(GNU Privacy Guard) 키는 디지털 서명 및 암호화를 위한 오픈 소스 소프트웨어입니다. 소프트웨어를 다운로드할 때 그 원본이 정품이고 무결성이 보장되도록 하는 데 사용됩니다. Docker 공식 저장소에서 GPG 키를 사용하는 이유는 Docker 패키지가 공식적이고 안전한 채널에서 제공되고 있음을 보장하려는 것입니다. 이러한 과정은 패키지의 신뢰성과 보안성을 강화하기 위해 채택되는 표준적인 절차 중 하나입니다.

여러 이유로 인해 GPG 키를 사용하는 것이 일반적입니다:

  1. 신뢰성 확보: GPG 키를 사용하면 소프트웨어의 원본이 공식적이고 정품임을 확인할 수 있습니다. 이는 소스가 타인에 의해 변조되지 않았음을 보장합니다.

  2. 보안 강화: GPG 키를 사용하면 중간자 공격(MITM, Man-in-the-Middle)과 같은 보안 위협으로부터 소프트웨어를 보호할 수 있습니다.

  3. 신뢰할 수 있는 채널 제공: GPG 키는 패키지 제공자에 대한 추가적인 신뢰성을 제공하며, 사용자는 공식적인 소프트웨어 채널에서 패키지를 수신함을 확인할 수 있습니다.

Docker 공식 저장소를 추가하고 GPG 키를 사용하는 것은 Docker를 신뢰할 수 있고 안전하게 설치할 수 있도록 하는 데 있어 일반적인 방법 중 하나입니다. 이러한 보안 및 신뢰성의 추가적인 단계는 사용자의 시스템이 안전하게 유지되고 소프트웨어가 안전하게 설치되도록 하는 데 도움이 됩니다.

정리

GPG 키는 소프트웨어를 다운로드 할 때 무결성과 정품인지 확인하는 키이고 따라서 docker를 공식 저장소에서 받기 이전에 먼저 GPG 키를 추가하는 것이다.
키를 통해 해당 소프트웨어를 검증함으로써 보안을 강화하는 용도로 사용된다는 것으로 이해했다.
굿!

결론

snap은 소프트웨어를 격리된 환경에 설치하는 것이다. 이것으로 여러 배포판의 리눅스 버전에서도 해당 소프트웨어를 호환성 문제 없이 사용할 수 있다. 하지만, AppArmor라고 불리는 리눅스 보안 모듈에 의해 권한이 제한된다. 그리고 이것을 해결하는 것은 snap 개발자들에게 있어서 매우 어렵고 복잡하다고 한다. 따라서, snap으로 소프트웨어를 설치하는 방법은 권한 문제를 야기할 수 있으니 권한에 민감한 소프트웨어의 경우 지양하도록 하자.

0개의 댓글