Ubuntu 22.04에서 gpg를 사용하여 apt-key 및 add-apt-repository의 사용 중지 처리하는 방법

소개

apt-key는 APT가 패키지를 인증하는 데 사용하는 키를 관리하는 유틸리티입니다. 이것은 외부 저장소를 추가하는 add-apt-repository 유틸리티와 밀접한 관련이 있으며, 키 서버를 사용하여 APT 설치의 신뢰할 수 있는 소스 목록에 외부 저장소를 추가합니다. 그러나 apt-keyadd-apt-repository를 사용하여 추가된 키는 전역적으로 apt에서 신뢰합니다. 이러한 키는 그들이 의도된 단일 저장소를 승인하는 것으로 제한되지 않습니다. 이러한 방식으로 추가된 모든 키는 다른 외부 저장소의 추가를 승인하는 데 사용될 수 있으며, 중요한 보안 문제를 제기합니다.

Ubuntu 20.10부터 apt-key 사용 시 미래에 이 도구가 폐기될 예정임을 나타내는 경고가 발생하며, 마찬가지로 add-apt-repository도 곧 폐기될 예정입니다. 이 폐기 경고는 Ubuntu 22.04에서 apt-keyadd-apt-repository의 사용을 엄격히 금지하지는 않지만, 이를 무시하는 것은 권장되지 않습니다.

현재의 최선의 실천 방법은 apt-keyadd-apt-repository 대신 gpg를 사용하는 것이며, 미래 버전의 Ubuntu에서는 유일한 옵션이 될 것입니다. apt-keyadd-apt-repository 자체가 항상 gpg를 백그라운드에서 호출하는 래퍼로 작동해 왔습니다. gpg를 직접 사용하면 중간 과정을 생략할 수 있습니다. 이러한 이유로 gpg 방법은 이전 버전의 Ubuntu와 역 호환성이 있으며 apt-key의 대체품으로 사용할 수 있습니다.

이 자습서에서는 각각 apt-keyadd-apt-repository 대신 대안을 사용하는 두 가지 절차를 개요로 설명하겠습니다. 첫 번째로는 apt-key 대신 gpg를 사용하여 공개 키를 사용하여 외부 저장소를 추가하는 것입니다. 둘째, 부록으로 이 자습서는 add-apt-repository를 사용하는 대신 키서버를 사용하여 외부 저장소를 추가하는 방법을 다룰 것입니다.

전제 조건

이 자습서를 완료하려면 Ubuntu 22.04 서버가 필요합니다. 이를 위해 우리의 Ubuntu 22.04용 초기 서버 설정 안내서에 따라 설정하십시오. root 권한이 없는 사용자와 sudo 권한, 그리고 활성화된 방화벽이 있어야 합니다.

단계 1 — 구성 요소 및 주요 형식 식별

PGP 또는 Pretty Good Privacy는 파일 및 디렉터리에 서명, 암호화 및 복호화에 사용되는 프로프라이어터리 암호화 프로그램입니다. PGP 파일은 이 프로세스에서 apt 내에서 유효한 소스로 저장소를 인증하는 데 사용되는 공개 키 파일입니다. GPG 또는 GNU Privacy Guard는 PGP의 오픈 소스 대안입니다. GPG 파일은 일반적으로 여러 개의 키를 보유하는 파일인 키링입니다. 이러한 파일 유형은 파일을 서명하고 암호화하는 데 일반적으로 사용됩니다.

gpg는 GPG의 명령 줄 도구로 apt와 함께 사용할 외부 저장소를 승인하는 데 사용할 수 있습니다. 그러나 gpg는 오직 GPG 파일만 수락합니다. PGP 파일로이 명령 줄 도구를 사용하려면 이를 변환해야 합니다.

Elasticsearch는 키 변환의 일반적인 시나리오를 제시하며, 본 섹션의 예로 사용됩니다. PGP 형식의 키를 다운로드하고 .gpg 파일 확장명을 사용하여 apt와 호환되는 형식으로 변환합니다. 이를 위해 gpg --dearmor 플래그를 사용하여 gpg 명령을 실행합니다. 그런 다음 패키지 소스 목록에 저장소 링크를 추가하면서 변환된 키에 대한 직접 참조를 첨부합니다. 마지막으로 Elasticsearch 패키지를 설치하여이 프로세스를 확인합니다.

키 확인이 필요한 프로젝트는 항상 공개 키와 해당 정확한 위치를 나타내는 리포지토리 URI를 제공합니다. Elasticsearch 예제의 경우 설치 페이지에서 이러한 구성 요소를 제공합니다.

다음은 Elasticsearch에 대해 제공된 구성 요소입니다:

  • 키: https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • 리포지토리: https://artifacts.elastic.co/packages/7.x/apt stable main

다음으로, 작업할 PGP 또는 GPG 파일이 제공되었는지 확인해야 합니다. 키 파일을 curl을 사용하여 열어 URL을 확인할 수 있습니다:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch

이렇게하면 키 파일의 내용이 출력되는데, 이는 다음과 같이 시작됩니다:

Output
-----BEGIN PGP PUBLIC KEY BLOCK----- . . .

URL에 GPG가 있더라도, 첫 번째 줄은 실제로 PGP 키 파일임을 나타냅니다. 이를 유의해야 합니다. 왜냐하면 apt는 GPG 형식만 허용하기 때문입니다. 원래 apt-key는 PGP 파일을 감지하고 gpg를 호출하여 자동으로 GPG로 변환했습니다. 단계 2에서는 PGP에서 GPG로 수동 변환 및 변환이 필요하지 않은 경우에 대해 다룰 것입니다.

단계 2 — 키 다운로드 및 apt 호환 파일 유형으로 변환

gpg 방법을 사용할 때는 항상 키를 다운로드한 후 패키지 소스 목록에 추가해야 합니다. 이전에는 apt-key를 사용할 때 이 순서가 항상 강제되지 않았습니다. 이제는 다운로드한 키 파일의 경로를 소스 목록에서 참조해야 합니다. 키를 다운로드하지 않았다면 당연히 기존 경로를 참조할 수 없습니다.

Elasticsearch를 사용하면 PGP 파일을 다루게 되는데, 다운로드 후에는 이를 GPG 파일 형식으로 변환해야 합니다. 다음 예제는 curl을 사용하여 키를 다운로드하고, 다운로드한 것을 gpg 명령에 파이프로 전달하여 사용합니다. gpg--dearmor 플래그로 PGP 키를 GPG 파일 형식으로 변환하며, -o는 파일 출력을 나타내는 데 사용됩니다.

Ubuntu에서는 /usr/share/keyrings 디렉터리가 변환된 GPG 파일을 저장하기에 권장되는 위치입니다. Ubuntu가 키링을 저장하는 기본 위치입니다. 이 예제에서 파일 이름은 elastic-7.x.gpg이지만 다른 이름도 작동합니다:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg

이렇게 하면 PGP 파일이 올바른 GPG 형식으로 변환되어 apt 소스 목록에 추가할 준비가 됩니다.

참고: 다운로드한 파일이 이미 GPG 형식이라면 다음 예제처럼 명령을 사용하여 변환하지 않고 /usr/share/keyrings로 직접 파일을 다운로드할 수 있습니다:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg

이 경우 curl 명령의 출력이 파일을 올바른 위치에 저장하기 위해 tee로 파이프됩니다.

단계 3 — 저장소를 패키지 소스 목록에 추가

다운로드한 키가 올바른 GPG 파일 형식에 있으면 해당 저장소를 가져올 때 키를 명시적으로 연결하여 apt 패키지 소스 목록에 추가할 수 있습니다. 이를 달성하는 세 가지 방법이 있으며, 모두 apt이 소스를 찾는 방식과 관련이 있습니다. apt은 중앙의 sources.list 파일, sources.list.d 디렉토리의 .list 파일 및 sources.list.d 디렉토리의 .source 파일에서 소스를 가져옵니다. 이 세 가지 옵션 사이에 기능적인 차이는 없지만, 세 가지 옵션을 고려하고 자신의 필요에 가장 잘 맞는 방법을 선택하는 것이 좋습니다.

옵션 1 — 직접 sources.list에 추가

첫 번째 방법은 소스를 직접 나타내는 라인을 /etc/apt/sources.list에 삽입하는 것입니다. 이 파일은 apt 소스를 포함하는 주 파일이며 여기에는 Ubuntu와 함께 제공되는 기본 소스뿐만 아니라 여러 소스가 포함되어 있습니다. 이 파일을 직접 편집하는 것은 완벽하게 허용되지만, Option 2 및 Option 3은 더 모듈식인 솔루션을 제공하여 편집 및 유지 관리가 더 쉬울 수 있습니다.

  1. sudo nano /etc/apt/sources.list

/etc/apt/sources.listnano 또는 선호하는 텍스트 편집기로 엽니다:

/etc/apt/sources.list
. . .
deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main

그런 다음 파일의 맨 아래에 외부 저장소를 추가합니다:

  • 이 라인에는 소스에 대한 다음과 같은 정보가 포함되어 있습니다:
  • deb: 이것은 소스가 일반 Debian 아키텍처를 사용한다는 것을 지정합니다.
  • arch=amd64,arm64: APT 데이터가 다운로드될 아키텍처를 지정합니다. 여기에서는 amd64arm64입니다.
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg: 이것은 이 소스를 승인하는 데 사용되는 키를 지정합니다. 여기서는 .gpg 파일이 /usr/share/keyrings에 저장되어 있습니다. 이 라인의 이 부분은 이전에 apt-key 방법에서 필요하지 않았지만 이제 필요한 것입니다. 이 추가는 apt-key에서의 원래 보안 결함을 수정하고 키를 승인할 수 있는 단일 저장소에 묶는 가장 중요한 변경 사항입니다.https://artifacts.elastic.co/packages/7.x/apt stable main: 이것은 저장소 내의 데이터가 정확히 위치하는 URI를 나타냅니다.
  • /etc/apt/sources.list.d/elastic-7.x.list: 이것은 새 파일의 위치와 이름입니다.
  • /dev/null: 이것은 명령의 출력이 필요하지 않을 때 사용됩니다. 이 위치에 tee를 지정하면 출력이 생략됩니다.

CTRL+O를 눌러 저장하고 나서 CTRL+X를 눌러 나가세요.

옵션 2 — sources.list.d에 새 .list 파일 만들기

이 옵션을 선택하면 대신에 sources.list.d 디렉터리에 새 파일을 만듭니다. apt는 이 디렉터리와 sources.list 모두를 저장소 추가를 위해 구문 분석합니다. 이 방법을 사용하면 저장소 추가를 물리적으로 별도의 파일에 격리시킬 수 있습니다. 나중에이 추가를 제거하거나 편집해야 할 경우, 이 파일을 편집하는 대신 중앙의 sources.list 파일을 삭제할 수 있습니다. 추가 사항을 별도로 유지하면 유지 관리가 더 쉬워지며, sources.list를 편집하는 것은 파일의 다른 저장소에 영향을 줄 수 있는 오류가 발생할 가능성이 더 높습니다.

이를 위해 echo 명령을 tee 명령으로 파이프하여 이 새 파일을 만들고 적절한 줄을 삽입합니다. 다음 예제에서 파일의 이름은 elastic-7.x.list이지만 디렉터리에서 고유한 파일 이름이면 어떤 이름이든 작동합니다.

  1. echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list > /dev/null

이 명령은 파일을 수동으로 생성하고 적절한 텍스트 줄을 삽입하는 것과 동일합니다.

옵션 3 — sources.list.d.sources 파일 생성하기

세 번째 방법은 .list 파일 대신 .sources 파일에 작성합니다. 이 방법은 비교적 새롭고, deb . . . 선언과 비교하여 모호하지 않은 deb822 다중 라인 형식을 사용하지만 기능적으로 동일합니다. 새 파일을 만듭니다:

  1. sudo nano /etc/apt/sources.list.d/elastic-7.x.sources

그런 다음 deb822 형식을 사용하여 외부 저장소를 추가합니다:

/etc/apt/sources.list.d/elastic-7.x.sources
Types: deb
Architectures: amd64 arm64
Signed-By: /usr/share/keyrings/elastic-7.x.gpg
URIs: https://artifacts.elastic.co/packages/7.x/apt
Suites: stable
Components: main

텍스트를 삽입한 후 저장하고 종료합니다.

이것은 일 줄 형식과 유사하며, 한 줄씩 비교하면 두 형식의 정보가 동일하게 구성되어 있지만 다르게 정렬됩니다. 한 가지 주목할 점은 이 형식이 여러 인수가 있는 경우 (예: amd64,arm64) 쉼표를 사용하지 않고 공백을 사용한다는 것입니다.

다음으로 테스트 설치를 수행하여이 프로세스를 확인합니다.

단계 4 — 외부 저장소에서 패키지 설치

당신은 apt에 대한 주요 sources.list 파일 및 sources.list.d의 모든 .list.sources 파일을 확인하도록 하기 위해 apt update를 호출해야합니다. 업데이트 없이 apt install를 호출하면 설치가 실패하거나 apt에서 오래된 기본 패키지를 설치할 수 있습니다.

리포지토리를 업데이트하십시오:

  1. sudo apt update

그런 다음 패키지를 설치하십시오:

  1. sudo apt install elasticsearch

apt-key 방법과 비교하여이 단계에서는 아무 변화도 없습니다. 이 명령이 완료되면 설치가 완료됩니다.

부록 – 키서버를 사용하여 외부 리포지토리 추가

이 섹션에서는 공개 키 대신 키서버와 함께 gpg를 사용하여 외부 리포지토리를 추가하는 방법에 대해 간단히 다룰 것입니다. 프로세스는 공개 키 방법과 거의 동일하지만 gpg를 호출하는 방법이 다릅니다.

add-apt-repositoryapt-key에 대응하는 키 서버 기반 기능이며, 둘 다 사용이 중단될 예정입니다. 이 시나리오에서는 다른 구성요소를 사용합니다. 키와 저장소 대신에 키 서버 URL과 키 ID가 제공됩니다. 이 경우에는 어떤 변환 작업 없이 키 서버에서 직접 적절한 .gpg 형식으로 다운로드할 수 있습니다. add-apt-repository가 곧 사용 중단될 예정이므로 기본 gpg 동작을 오버라이드하여 파일로 다운로드하는 대신에 gpg를 사용하여 기존 키링에 가져오는 동작을 대체할 것입니다.

R을 예로 들어 오픈 소스 프로그래밍 언어를 사용할 때, 다음과 같은 구성 요소가 있습니다. 이는 또한 공식 프로젝트 사이트의 설치 지침에서 찾을 수 있습니다:

  • 키 서버: keyserver.ubuntu.com
  • 키 ID: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • 저장소: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

먼저 gpg를 사용하여 키 서버에서 직접 다운로드합니다. 다운로드 트래픽에 따라 이 다운로드 명령이 완료되는 데 시간이 오래 걸릴 수 있음에 유의하십시오:

  1. sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

이 명령에는 다음과 같은 플래그가 포함되어 있으며, 이는 공개 키와 함께 gpg를 사용하는 것과 다릅니다:

  • --no-default-keyring--keyring을 결합하여 기존 키링에 가져오는 대신 새 파일로 출력할 수 있습니다. 이것이 이 시나리오에서의 gpg의 기본 동작입니다.
  • --keyserver--recv-keys를 결합하면 특정 키와 해당 위치를 제공합니다.
  • --homedir는 임시 파일을 만들기 위한 기본 위치를 덮어쓰는 데 사용됩니다. gpg는 이 명령을 완료하기 위해 이러한 파일을 생성해야 하며, 그렇지 않으면 gpg/root에 쓰려고 시도하여 권한 오류가 발생합니다. 대신 이 명령은 임시 파일을 적절한 /tmp 디렉토리에 위치시킵니다.

다음으로, 저장소를 .list 파일에 추가합니다. 이는 외부 저장소를 공개 키를 사용하여 추가하는 것과 정확히 동일한 방식으로 수행되며 echo 명령을 tee 명령으로 파이핑하여 이루어집니다:

  1. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/R.gpg] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" | sudo tee /etc/apt/sources.list.d/R.list > /dev/null

그런 다음 저장소 목록을 업데이트합니다:

  1. sudo apt update

이제 패키지를 설치할 수 있습니다:

  1. sudo apt install r-base

gpg를 사용하여 외부 저장소를 추가하는 방법은 공개 키와 키서버 간에 유사하지만 gpg를 호출하는 방식이 다릅니다.

결론

{
“error”: “Upstream error…”
}

Source:
https://www.digitalocean.com/community/tutorials/how-to-handle-apt-key-and-add-apt-repository-deprecation-using-gpg-to-add-external-repositories-on-ubuntu-22-04