소개
apt-key
는 APT가 패키지를 인증하는 데 사용하는 키를 관리하는 유틸리티입니다. 이것은 외부 저장소를 추가하는 add-apt-repository
유틸리티와 밀접한 관련이 있으며, 키 서버를 사용하여 APT 설치의 신뢰할 수 있는 소스 목록에 외부 저장소를 추가합니다. 그러나 apt-key
및 add-apt-repository
를 사용하여 추가된 키는 전역적으로 apt
에서 신뢰합니다. 이러한 키는 그들이 의도된 단일 저장소를 승인하는 것으로 제한되지 않습니다. 이러한 방식으로 추가된 모든 키는 다른 외부 저장소의 추가를 승인하는 데 사용될 수 있으며, 중요한 보안 문제를 제기합니다.
Ubuntu 20.10부터 apt-key
사용 시 미래에 이 도구가 폐기될 예정임을 나타내는 경고가 발생하며, 마찬가지로 add-apt-repository
도 곧 폐기될 예정입니다. 이 폐기 경고는 Ubuntu 22.04에서 apt-key
및 add-apt-repository
의 사용을 엄격히 금지하지는 않지만, 이를 무시하는 것은 권장되지 않습니다.
현재의 최선의 실천 방법은 apt-key
와 add-apt-repository
대신 gpg
를 사용하는 것이며, 미래 버전의 Ubuntu에서는 유일한 옵션이 될 것입니다. apt-key
와 add-apt-repository
자체가 항상 gpg
를 백그라운드에서 호출하는 래퍼로 작동해 왔습니다. gpg
를 직접 사용하면 중간 과정을 생략할 수 있습니다. 이러한 이유로 gpg
방법은 이전 버전의 Ubuntu와 역 호환성이 있으며 apt-key
의 대체품으로 사용할 수 있습니다.
이 자습서에서는 각각 apt-key
와 add-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을 확인할 수 있습니다:
- 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
이지만 다른 이름도 작동합니다:
- 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
로 직접 파일을 다운로드할 수 있습니다:
- 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은 더 모듈식인 솔루션을 제공하여 편집 및 유지 관리가 더 쉬울 수 있습니다.
- sudo nano /etc/apt/sources.list
/etc/apt/sources.list
를 nano
또는 선호하는 텍스트 편집기로 엽니다:
. . .
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 데이터가 다운로드될 아키텍처를 지정합니다. 여기에서는amd64
및arm64
입니다.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
이지만 디렉터리에서 고유한 파일 이름이면 어떤 이름이든 작동합니다.
- 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
다중 라인 형식을 사용하지만 기능적으로 동일합니다. 새 파일을 만듭니다:
- sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
그런 다음 deb822
형식을 사용하여 외부 저장소를 추가합니다:
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
에서 오래된 기본 패키지를 설치할 수 있습니다.
리포지토리를 업데이트하십시오:
- sudo apt update
그런 다음 패키지를 설치하십시오:
- sudo apt install elasticsearch
apt-key
방법과 비교하여이 단계에서는 아무 변화도 없습니다. 이 명령이 완료되면 설치가 완료됩니다.
부록 – 키서버를 사용하여 외부 리포지토리 추가
이 섹션에서는 공개 키 대신 키서버와 함께 gpg
를 사용하여 외부 리포지토리를 추가하는 방법에 대해 간단히 다룰 것입니다. 프로세스는 공개 키 방법과 거의 동일하지만 gpg
를 호출하는 방법이 다릅니다.
add-apt-repository
은 apt-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
를 사용하여 키 서버에서 직접 다운로드합니다. 다운로드 트래픽에 따라 이 다운로드 명령이 완료되는 데 시간이 오래 걸릴 수 있음에 유의하십시오:
- 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
명령으로 파이핑하여 이루어집니다:
- 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
그런 다음 저장소 목록을 업데이트합니다:
- sudo apt update
이제 패키지를 설치할 수 있습니다:
- sudo apt install r-base
gpg
를 사용하여 외부 저장소를 추가하는 방법은 공개 키와 키서버 간에 유사하지만 gpg
를 호출하는 방식이 다릅니다.
결론
{
“error”: “Upstream error…”
}