Clevis는 자동화된 암호 해독을 위한 플러그형 프레임워크입니다. 이는 데이터의 자동 암호 해독 또는 LUKS 볼륨의 자동 잠금 해제를 제공하는 데 사용될 수 있습니다.
이것은 어떻게 생겼나요? 첫 번째 단계는 일부 데이터를 암호화하는 것입니다. 간단한 명령으로 이 작업을 수행합니다.
$ clevis encrypt PIN CONFIG < PLAINTEXT > CIPHERTEXT.jwe
이 명령은 표준 입력에서 일반 텍스트를 가져와 표준 출력에서 암호화된 JWE 개체를 생성합니다. 일반 텍스트 외에도 두 개의 추가 입력 매개변수를 지정해야 합니다.
먼저 핀입니다. 클레비스 용어에서 핀은 자동화된 암호 해독을 구현하는 플러그인입니다. 여기서는 핀 이름만 전달하면 됩니다.
둘째, 구성이다. 구성은 핀에 직접 전달되는 JSON 개체입니다. 여기에는 암호화를 수행하고 자동화된 암호 해독을 설정하는 데 필요한 모든 구성이 포함되어 있습니다.
JWE의 암호를 해독하려면 다음을 수행하면 됩니다.
$ clevis decrypt < CIPHERTEXT.jwe > PLAINTEXT
해독 명령에는 추가 입력이나 상호 작용이 필요하지 않습니다. 좀 더 구체적인 예를 살펴보겠습니다.
Tang은 에스크로 없이 암호화 바인딩 서비스를 제공하는 서버 구현입니다. Clevis는 Tang을 전폭적으로 지원합니다. 다음은 Tang과 함께 Clevis를 사용하는 방법의 예입니다.
$ echo hi | clevis encrypt tang ' {"url": "http://tang.local"} ' > hi.jwe
The advertisement is signed with the following keys:
kWwirxc5PhkFIH0yE28nc-EvjDY
Do you wish to trust the advertisement ? [yN] y
이 예에서는 Tang 핀을 사용하여 "hi" 메시지를 암호화합니다. 이 경우 필요한 유일한 매개변수는 Tang 서버의 URL입니다. 암호화 과정에서 Tang 핀은 서버에 키 광고를 요청하고 키를 신뢰하도록 요청합니다. 이는 SSH와 유사하게 작동합니다.
또는 adv
매개변수를 사용하여 광고를 수동으로 로드할 수 있습니다. 이 매개변수는 광고가 저장된 파일을 참조하는 문자열이나 광고 자체의 JSON 콘텐츠를 사용합니다. 이렇게 광고를 수동으로 지정하면 Clevis는 해당 광고를 신뢰할 수 있는 것으로 가정합니다.
Clevis는 TPM2(Trusted Platform Module 2.0) 칩에서 키 암호화를 지원합니다. 암호화에 사용되는 암호학적으로 강력한 임의 키는 TPM2 칩을 사용하여 암호화되며, 해독 시 TPM2를 사용하여 해독되므로 clevis가 JWE에 저장된 비밀을 해독할 수 있습니다.
예를 들어:
$ echo hi | clevis encrypt tpm2 ' {} ' > hi.jwe
Clevis는 암호화된 키의 공개 및 개인 키를 JWE 객체에 저장하므로 TPM2를 사용하여 암호화된 키를 풀기 위해 암호 해독 시 해당 키를 가져올 수 있습니다.
Clevis는 RFC 7512: The PKCS#11 URI Scheme에 설명된 대로 PKCS#11 애플리케이션의 역할을 수행할 수 있습니다.
PKCS#11 프로토콜은 잠금 해제 프로세스가 성공하려면 하드웨어 장치에 PIN(개인 식별 번호)을 구성해야 한다고 결정합니다. Clevis는 사용자가 특정 암호화된 디스크의 잠금을 해제할 수 있도록 하고 PIN을 얻을 수 있는 방법을 제공합니다. 두 가지 가능성이 있습니다:
1 - 부팅 시 PIN 제공: 이 첫 번째 경우 Clevis는 PKCS#11 장치를 감지하고 해당 PIN을 묻는 메시지를 표시합니다. PIN이 잘못된 경우 Clevis는 PIN을 다시 묻는 메시지를 표시합니다. PIN을 알 수 없는 경우 장치의 잠금/브릭 가능성을 인지하는 것은 사용자의 책임입니다.
2 - 클레비스 구성 시 PIN 제공: 이 두 번째 경우에는 클레비스가 PIN 값으로 구성됩니다.
처음에 RFC7512는 장치와 잠금 해제에 필요한 정보를 모두 식별할 수 있는 특별한 종류의 URI( pkcs11
URI)를 지정하는 메커니즘을 정의합니다. PIN 값이나 PIN 위치를 각각 지정할 수 있는 pin-value
매개변수에 특별한 주의를 기울여야 합니다. Clevis는 처음에는 '핀 값' 매개변수를 이해합니다. 아래에서 이전 매개변수를 사용하는 PKCS#11 URI의 예를 찾을 수 있습니다.
pin-value
정의된 PKCS#11 URI: pkcs11:token=Software%20PKCS%2311%20softtoken;manufacturer=Snake%20Oil,%20Inc.?pin-value=the-pin
다음 섹션에서는 암호화된 디스크에 바인딩할 PKCS#11 장치에 대한 다양한 옵션이 무엇인지 명확하게 설명할 수 있도록 Clevis 구성 예가 제공됩니다.
Clevis는 사용자가 특정 PKCS#11 장치를 암호화된 장치에 바인딩할 수 있는 메커니즘을 제공합니다. Clevis의 새 핀 이름은 pkcs11
이며 구성 방법은 현재 사용되는 것과 동일합니다.
$ clevis luks bind -h
Usage: clevis luks bind [-y] [-f] [-s SLT] [-k KEY] [-t TOKEN_ID] [-e EXISTING_TOKEN_ID] -d DEV PIN CFG
첫 번째 예로, 사용자는 Clevis에 URI를 지정하여 장치 정보를 제공할 수 있습니다.
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;
serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key"}'
추가 옵션은 Clevis가 찾은 첫 번째 PKCS#11 장치가 바인딩되도록 Clevis에 구성을 제공하는 것입니다. 이를 위해 아래와 같이 빈 URI를 제공할 수 있습니다.
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:"}'
이전 명령과 동등한 더 짧은 구성 명령이 아래에 표시됩니다.
$ clevis luks bind -d /dev/sda1 pkcs11 '{}'
이 경우 Clevis는 장치 감지에 대한 책임을 지며, 장치가 발견되지 않으면 해당 오류를 덤프할 책임이 있습니다.
빈 URI를 제공하면 Clevis가 원하지 않는 키로 실수로 암호화되는 것을 방지하기 위해 토큰과 일치하는 사용 가능한 키 중 하나를 선택하라는 메시지를 표시하게 된다는 점을 명확히 해야 합니다.
Clevis에 모듈 경로를 제공하여 해당 모듈을 사용하여 장치에 액세스할 수 있습니다. 이는 기본 Clevis 소프트웨어(OpenSC)에서 카드를 지원하지 않는 경우에만 필요합니다. 이러한 이유로 모듈 경로 필드는 완전히 선택 사항입니다. 모듈 위치를 제공하기 위해 사용자는 "uri" Clevis 구성에 "module-path"를 제공할 수 있습니다.
$ clevis-luks-bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;
serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key?
module-path=/usr/local/lib64/libmypkcs11.so"}'
나머지 장치와 마찬가지로 PKCS#11 장치에 바인딩된 암호화된 디스크는 clevis luks list
명령을 사용하여 확인할 수 있습니다.
$ clevis luks list -d /dev/sda1
1: pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;
serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key?
module-path=/usr/local/lib64/libmypkcs11.so"}'
개발의 첫 번째 단계에서 Clevis는 OpenSC 위에서 사용되어 PKCS#11 기능을 제공합니다. OpenSC, 특히 pkcs11-tool
암호 해독에 사용할 메커니즘을 나타내는 옵션을 제공합니다. 테스트 목적으로 SoftHSM과 같은 일부 라이브러리는 기본 pkcs11-tool
메커니즘에서 작동하지 않으므로 사용할 특정 메커니즘을 제공해야 합니다. 이러한 이유로 Clevis에는 기본 RSA-PKCS-OAEP
유효하지 않은 경우 사용할 메커니즘이 제공될 수 있습니다.
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:", "mechanism":"RSA-PKCS"}'
특정 토큰에 사용 가능한 메커니즘을 확인하려면 pkcs11-tool -M
명령을 사용할 수 있습니다.
$ pkcs11-tool -M
Using slot 0 with a present token (0x0)
Supported mechanisms:
SHA-1, digest
...
SHA512, digest
MD5, digest
...
RSA-PKCS-KEY-PAIR-GEN, keySize={2048,4096}, generate_key_pair
현재 Clevis에서는 RSA 메커니즘만 지원됩니다. 나머지 알고리즘의 제한으로 인해 다른 비대칭 암호화 알고리즘은 암호화를 쉽게 수행할 수 없습니다. ECC는 서명과 키 파생만 지원하고 암호화는 지원하지 않습니다. 암호화 작업은 키 파생을 통해 어떻게든 구성할 수 있지만 간단한 작업은 아닙니다.
RSA-PKCS 메커니즘(암호화를 위한 PKCS#1.5 패딩)은 안전하지 않은 것으로 간주되어 대부분 호환성을 위해 제공되지만 프로덕션에서는 사용하지 않는 것이 좋습니다.
Clevis에서는 URI에 제공된 매개변수를 통해 PKCS#11 장치가 있는 슬롯을 지정할 수 있습니다.
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:slot-id=0"}'
슬롯 정보만 제공하면 Clevis가 선택한 슬롯의 토큰과 일치하는 사용 가능한 키 중 하나를 추측하게 되어 원하지 않는 키로 실수로 암호화가 발생할 수 있다는 점을 명확히 해야 합니다. 슬롯 ID는 PKCS#11 모듈 초기화 전체에서 안정성이 보장되지 않는 숫자이므로 슬롯을 장치 선택기로 사용하지 않는 것이 좋습니다 . 그러나 안정적인 슬롯 식별자를 제공하는 특정 라이브러리와 모듈이 있으므로 이러한 특정 경우에 사용할 수 있습니다.
서로 다른 PKCS#11 장치를 구별하는 더 나은 두 가지 옵션이 있습니다.
1 - 공개 키 객체를 사용한 다중 장치 구성( 권장 ):
OpenSC
의 최신 버전(OpenSC 0.26.0 릴리스부터)에서는 Clevis가 대부분의 PKCS#11 명령을 처리하는 데 사용하는 pkcs11-tool
이후 PKCS#11 URI가 토큰과 객체 모두에 대해 덤프됩니다. 특정 토큰:
$ pkcs11-tool -L | grep uri
uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=42facd1f749ece7f;token=clevis
uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29
$ pkcs11-tool -O --slot-index 1 --type pubkey | grep uri
ising slot 0 with a present token (0x0)
uri: pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public
이 특별한 경우에 여러 PKCS#11 장치가 존재하는 경우 특정 장치의 공개 키를 선택하고 이를 Clevis에 바인딩합니다.
$ clevis luks bind -d /dev/sda pkcs11 '{"uri":"pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public"}'
module-path를 사용하는 경우 --module 옵션을 제공할 때 반환된 경로를 사용해야 합니다.
$ pkcs11-tool --module /usr/lib64/libykcs11.so -O --type pubkey | grep uri
/usr/local/bin/pkcs11-tool.manual --module /usr/lib64/libykcs11.so -O --type pubkey | grep uri
Using slot 0 with a present token (0x0)
uri: pkcs11:model=YubiKey%20YK5;manufacturer=Yubico%20%28www.yubico.com%29;serial=28083311;token=YubiKey%20PIV%20%2328083311;id=%03;object=Public%20key%20for%20Key%20Management;type=public
uri: pkcs11:model=YubiKey%20YK5;manufacturer=Yubico%20%28www.yubico.com%29;serial=28083311;token=YubiKey%20PIV%20%2328083311;id=%19;object=Public%20key%20for%20PIV%20Attestation;type=public
$ clevis luks bind -d /dev/sda pkcs11 '{"uri":"pkcs11:model=YubiKey%20YK5;manufacturer=Yubico%20%28www.yubico.com%29;serial=28083311;token=YubiKey%20PIV%20%2328083311;id=%03;object=Public%20key%20for%20Key%20Management;type=public;module-path=/usr/lib64/libykcs11.so"}'
2 - 직렬 + 토큰 사양을 사용한 다중 장치 구성:
pkcs11-tool
토큰/객체에 대한 URI를 덤프하지 않는 버전의 경우 Clevis는 장치 serial
+ token label
쌍을 사용하여 특정 식별을 "시도"합니다. 이러한 유형의 시나리오에서는 PIN을 요청할 때 Clevis가 장치에 대해 쉽게 알릴 수 있도록 model
제공해야 하지만 다음 두 매개변수를 사용하여 식별을 수행할 수 있습니다.
# pkcs11-tool -L | grep "token label|serial"
token label : OpenPGP card (User PIN)
serial num : 42facd1f749ece7f
$ clevis luks bind -d /dev/sda pkcs11 '{"uri":"pkcs11:model=PKCS%2315%20emulated;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29"}'
특수 문자는 RFC 7512: The PKCS#11 URI Scheme에 정의된 대로 백분율 모드로 정의되어야 한다는 점을 기억하세요.
clevis PKCS#11 기능을 설치하고 구성하려면 다음 단계를 따라야 합니다.
1 - PKCS#11 종속성을 포함하여 Clevis 필수 종속성을 설치합니다.
$ sudo dnf install -y opensc pcsc-lite openssl socat
2 - PKCS11 장치는 "pkcs11-tool"을 통해 액세스할 수 있어야 합니다.
$ pkcs11-tool -L
pkcs11-tool -L
Available slots:
Slot 0 (0x0): Yubico YubiKey OTP+CCID 00 00
token label : clevis
...
uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=42facd1f749ece7f;token=clevis
3 - U자형 갈고리와 결합하도록 장치 구성:
$ sudo clevis luks bind -d /dev/sda5 pkcs11 '{"uri":"pkcs11:"}'
사용할 모듈을 제공해야 하는 경우 module-path
URI 매개변수를 통해 수행할 수 있습니다.
$ sudo clevis luks bind -d /dev/sda5 pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2"}'
4 - clevis-luks-pkcs11-askpass.socket 장치 활성화:
$ sudo systemctl enable --now clevis-luks-pkcs11-askpass.socket
5 - /etc/crypttab 구성:
PKCS#11 기능이 제대로 작동하려면 systemd가 AF_UNIX 소켓을 사용하여 디스크 잠금을 해제하는 키 문구를 기다리고 콘솔을 통해 메시지를 표시하지 않도록 /etc/crypttab
파일을 구성해야 합니다.
Clevis PKCS#11 장치 파일은 /run/systemd/clevis-pkcs11.sock
경로에 소켓을 구성하여 디스크 잠금 해제에 대한 정보를 보내고 받습니다. PKCS#11 Clevis 핀을 통해 잠금 해제되는 디스크의 경우 해당 소켓 파일을 키 파일로 구성해야 합니다. 따라서 잠금 해제를 수행하려면 /etc/crypttab
에 다음 변경 사항을 도입해야 합니다.
$ sudo diff -Nuar /etc/crypttab.ori /etc/crypttab
--- /etc/crypttab.ori 2024-07-04 10:46:16.295073739 +0200
+++ /etc/crypttab 2024-07-03 17:14:27.764743860 +0200
@@ -1 +1,2 @@
-luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 - -
+luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 /run/systemd/clevis-pkcs11.sock keyfile-timeout=30s
일부 잠금 해제 오류가 발생하고 콘솔을 통해 수동으로 암호를 입력해야 하는 경우 폴스루 메커니즘을 구성하기 위해 keyfile-timeout
옵션을 설정하는 것이 좋습니다.
6 - 재부팅 및 테스트:
시스템은 부팅하고 PKCS#11 장치 PIN을 요청해야 하며, PIN이 올바른 경우에만 해당 구성된 암호화된 디스크의 암호를 해독해야 합니다.
7 - 부팅 프로세스를 테스트할 필요가 없는 경우 다음 명령으로 암호화 및 암호 해독하고(적절하게 작동하려면 PIN 값을 제공해야 함) 이 한 줄로 문자열의 암호화/암호 해독을 수행할 수 있는지 확인하세요. 이며 오류가 발생하지 않습니다.
$ echo "top secret" | clevis encrypt pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2?pin-value=123456"}' | clevis decrypt
top secret
문자열이 반환되어야 합니다.
Clevis는 핀을 혼합하여 정교한 잠금 해제 정책을 제공하는 방법을 제공합니다. 이는 SSS(Shamir Secret Sharing)라는 알고리즘을 사용하여 수행됩니다.
SSS는 임계값 체계입니다. 키를 생성하고 이를 여러 조각으로 나눕니다. 각 조각은 다른 핀을 사용하여 암호화됩니다(SSS도 재귀적으로 가능). 또한 임계값 t
정의합니다. 최소한 t
개의 조각을 해독할 수 있으면 암호화 키를 복구할 수 있으며 해독에 성공할 수 있습니다.
다음은 Tang 핀과 TPM2 핀 모두에 SSS 핀을 사용하는 예입니다.
$ echo hi | clevis encrypt sss
' {"t": 2, "pins": {"tpm2": {"pcr_ids": "0"}, "tang": {"url": "http://tang.local"}}} '
> hi.jwe
위의 예에서는 두 개의 하위 핀을 정의하고 임계값은 2입니다. 이는 SSS 자체가 성공하려면 암호 해독 중에 두 하위 핀이 모두 성공해야 함을 의미합니다.
다음은 Tang 핀만 사용하는 또 다른 예입니다.
$ echo hi | clevis encrypt sss
' {"t": 1, "pins": {"tang": [{"url": "http://server1.local/key"}, {"url": "http://server2.local/key"}]}} '
> hi.jwe
이 예에서는 Tang 핀의 하위 인스턴스 두 개를 정의합니다. 각 인스턴스는 고유한 구성을 갖습니다. 임계값이 1이므로 Tang 핀 인스턴스 중 하나가 해독 중에 성공하면 SSS가 성공합니다.
Clevis를 사용하면 핀을 사용하여 LUKS 볼륨을 바인딩하여 자동으로 잠금을 해제할 수 있습니다.
이것이 작동하는 방식은 다소 간단합니다. 우리는 암호화된 강력한 새 키를 생성합니다. 이 키는 추가 암호로 LUKS에 추가됩니다. 그런 다음 Clevis를 사용하여 이 키를 암호화하고 LUKSMeta를 사용하여 LUKS 헤더 내부에 출력 JWE를 저장합니다.
다음은 Tang 핀을 사용하여 /dev/sda1
바인딩하는 예입니다.
$ sudo clevis luks bind -d /dev/sda1 tang ' {"url": "http://tang.local"} '
The advertisement is signed with the following keys:
kWwirxc5PhkFIH0yE28nc-EvjDY
Do you wish to trust the advertisement ? [yN] y
Enter existing LUKS password:
이 바인딩 프로세스가 성공적으로 완료되면 제공된 잠금 해제 프로그램 중 하나를 사용하여 디스크 잠금을 해제할 수 있습니다.
네트워크 기반 잠금 해제를 사용하려면 커널 인수로 rd.neednet=1
지정하거나 dracut으로 생성할 때 --hostonly-cmdline
사용해야 합니다.
TLS(예: '{"url": "https://tang.remote"}'
)와 함께 Tang을 사용하는 경우 /etc/ssl
폴더가 initramfs 이미지 --include /etc/ssl /etc/ssl --force
에 포함되어야 합니다. --include /etc/ssl /etc/ssl --force
으로 생성할 때 강제 실행.
Dracut 잠금 해제 프로그램은 초기 부팅 중에 자동으로 볼륨 잠금을 해제하려고 시도합니다. 이를 통해 자동화된 루트 볼륨 암호화가 가능해집니다. Dracut 잠금 해제 프로그램을 활성화하는 것은 쉽습니다. Clevis를 설치한 후 initramfs를 다시 빌드하세요.
$ sudo dracut -f
재부팅하면 비밀번호를 사용하여 볼륨을 잠금 해제하라는 메시지가 표시됩니다. 백그라운드에서 Clevis는 자동으로 볼륨 잠금을 해제하려고 시도합니다. 성공하면 암호 프롬프트가 취소되고 부팅이 계속됩니다.
initramfs-tools와 함께 Clevis를 사용할 때 initramfs를 다시 빌드하려면 다음을 실행해야 합니다.
sudo update-initramfs -u -k ' all '
재부팅하면 Dracut을 사용하는 것처럼 정확하게 작동합니다.
UDisks2 잠금 해제 프로그램은 데스크톱 세션에서 실행됩니다. 수동으로 활성화할 필요는 없습니다. Clevis UDisks2 잠금 해제 프로그램을 설치하고 데스크톱 세션을 다시 시작하세요. 잠금해제 프로그램이 자동으로 시작되어야 합니다.
이 잠금 해제 장치는 Dracut 잠금 해제 장치와 거의 동일하게 작동합니다. Clevis와 바인딩된 이동식 저장 장치를 삽입하면 데스크톱 비밀번호 프롬프트와 동시에 자동으로 잠금 해제를 시도합니다. 자동 잠금 해제에 성공하면 사용자 개입 없이 비밀번호 프롬프트가 닫힙니다.
Clevis 정책에 바인딩된 LUKS 장치는 clevis luks Unlock 명령을 사용하여 잠금 해제할 수도 있습니다.
$ sudo clevis luks unlock -d /dev/sda1
clevis luks unbind 명령을 사용하여 LUKS 볼륨을 바인딩 해제할 수 있습니다. 예를 들어:
$ sudo clevis luks unbind -d /dev/sda1 -s 1
특정 LUKS 볼륨에 바인딩된 핀은 clevis luks list 명령을 사용하여 나열할 수 있습니다. 예를 들어:
$ sudo clevis luks list -d /dev/sda1
Clevis를 직접 설치하지 마십시오. 대신, 선호하는 배포판 패키지를 사용하세요.
이 명령은 핵심 Clevis 명령인 Dracut 잠금 해제 장치와 UDisks2 잠금 해제 장치를 각각 설치합니다.
$ sudo dnf install clevis clevis-dracut clevis-udisks2
이전 섹션에서 언급한 것처럼 Clevis를 직접 설치하지 않는 것이 좋습니다 . 그러나 Linux 배포판에 Clevis 패키지가 없는 경우 Clevis를 수동으로 컴파일하고 설치하는 단계는 다음 단계입니다.
$ wget https://github.com/latchset/clevis/releases/download/v21/clevis-21.tar.xz
$ tar Jxvf clevis-21.tar.xz
$ cd clevis-21
$ mkdir build
$ cd build
meson
실행하세요. $ meson setup ..
ninja
명령으로 컴파일: $ ninja
ninja install
명령을 사용하여 설치합니다(루트 권한이 필요함): $ sudo ninja install