kds/doc/keyring.md
ndiezel0 bc05d3dd63
CDS-92: Filter sensitive meta in logs (#7)
* CDS-92: Filter logs from sensitive meta

* CDS-92: Make filter content dependant

* CDS-92: Bump cds_proto and doc

* CDS-92: Add GetKeyring filtering

* CDS-92: Make filter whitelist instead of whitelist

* CDS-92: Move filter_keys to filter

* CDS-92: Skip filtering for internal woody errors

* CDS-92: Update JOSE regex

* CDS-92: Upgrade cds_proto

* CDS-92: Add system errors to whitelist

* CDS-92: Add try catch to thrift handlers

* CDS-92: Review fix

* CDS-92: Review fixes
2019-07-16 17:13:26 +03:00

15 KiB
Raw Permalink Blame History

Операции с Keyring

Подготовка

Устанавливаем Step Cli

https://github.com/smallstep/cli#installation-guide

Создаем JWK ключ

RSA 4096 ключ для шифрования:

step crypto jwk create rsa-enc.pub.json rsa-enc.json --kty RSA --size 4096 --use enc

EC ключ для криптоподписи:

step crypto jwk create ec.pub.json ec.json --kty EC --crv P-256 --use sig

Добавляем JWK в конфигурацию

Добавляем публичный ключ из rsa-enc.pub.json и ec.pub.json в map конфигурации shareholders:

{shareholders, #{
    <<"ndiezel">> => #{
        owner => <<"ndiezel0@gmail.com">>,
        public_keys => #{
            enc =>
                <<"{
                    \"use\": \"enc\",
                    \"kty\": \"RSA\",
                    \"kid\": \"KUb1fNMc5j9Ei_IV3DguhJh5UOH30uvO7qXq13uevnk\",
                    \"alg\": \"RSA-OAEP-256\",
                    \"n\": \"2bxkamUQjD4CN8rcq5BfNLJmRmosb-zY7ajPBJqtiLUTcqym23OkUIA1brBg34clmU2ZQmtd3LWi5kVJk_wr4WsMG_78jHK3wQA-HRhY4WZDZrULTsi4XWpNSwL4dCml4fs536RKy_TyrnpiXg0ug4JVVaEeo7VIZ593mVhCxC8Ev6FK8tZ2HGGOerUXLpgQdhcp9UwaI_l7jgoWNp1f7SuBqv1mfiw4ziC1yvwyXHTKy-37LjLmVB9EVyjqpkwZgzapaOvHc1ABqJpdOrUh-PyOgq-SduqSkMrvqZEdUeR_KbFVxqbxqWJMrqkl2HOJxOla9cHRowg5ObUBjeMoaTJfqie3t6uRUsFEFMzhIyvo6QMYHooxIdOdwpZ4tpzML6jv9o5DPtN375bKzy-UsjeshYbvad1mbrcxc8tYeiQkDZEIM0KeOdHm5C6neEyY6oF4s1vSYBNCnhE5O-R9dmp8Sk5KEseEkOH5u4G2RsIXBA9z1OTDoy6qF21EvRCGzsGfExfkmPAtzbnS-EHHxbMUiio0ZJoZshYo8dwJY6vSN7UsXBgW1v7GvIF9VsfzRmgkl_3rdemYy28DJKC0U2yufePcA3nUJEhtR3UO_tIlHxZvlDSX5eTx4vs5VkFfujNSiPsgH0PEeXABGBFbal7QxU1u0XHXIFwhW5cM8Fs\",
                    \"e\": \"AQAB\"
                }">>,
            sig =>
                <<"{
                    \"use\": \"sig\",
                    \"kty\": \"EC\",
                    \"kid\": \"03ohMufKvFyAtbaXJO83S4nPkaiiLPF8dSUPtetU_CA\",
                    \"crv\": \"P-256\",
                    \"alg\": \"ES256\",
                    \"x\": \"N3E6i6WabPQg7MVqsjXd81z6dmSVibxLbgYJ1UIvHR4\",
                    \"y\": \"jDzBx7KDMzesKbpwl5H1J0TtwvOJxPaEC5wH6zZs_r8\"
                }">>
        }
    }
}}

Инициализация

Запуск kds из состояния отсутствующего Keyring.

Разделен на 2 этапа: Начало и Валидация.

На этапе 'Начало' указывается количество фрагментов ключа, при комбинации которых мы получим MasterKey, который шифрует Keyring. Результат - зашифрованные публичными ключами из конфигурации фрагменты MasterKey, которые отдаются соответствующим владельцам для прохождения следующего этапа 'Валидация'.

На этапе 'Валидация' каждый владелец ключа передает свой расшифрованный фрагмент ключа в виде JWS, подписанного личным криптоключом. Процесс инициализации можно считать завершенным, когда последнему владельцу приходит struct Success {}.

В случае передачи владельцем фрагмента ключа с неверной подписью, он отвергается, а процесс валидации продолжается. В случае передачи владельцем некорректного или устаревшего фрагмента, он принимается, но после получения последнего фрагмента вернется ошибка и процесс инициализации будет сброшен с необходимостью начать с этапа 'Начало'.

Этап 'Валидация' необходим для подтверждения того, что все фрагменты MasterKey были доставлены своим адресатам и успешно расшифрованны.

Начало

Начинаем процесс инициализации:

$ woorl -s cds_proto/proto/keyring.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement StartInit '<insert threshold here>'

threshold - количество фрагментов мастер-ключа, которое нужно для его востановление

Получаем зашифрованные части мастер-ключа вида:

[
  {
    "id": "ndiezel",
    "owner": "ndiezel0@gmail.com",
    "encrypted_share": "<EncryptedMasterKeyShare>"
  }
]

Отдаем encrypted_share соответствующим владельцам

Валидация

Каждый владелец фрагментов ключа расшифровывает свой фрагмент, подписывает и отдает на валидацию:

$ echo "<insert EncryptedMasterKeyShare here>" | \
  step crypto jwe decrypt --key rsa-enc.json | \
  step crypto jws sign - --key ec.json | \
  woorl -s cds_proto/proto/kds.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement ValidateInit '{"id":"<insert id, ex. ndiezel>","signed_share":"'"$(cat -)"'"}'

EncodedMasterKeyShare - полученный зашифрованный фрагмент мастер-ключа

http://kds:8022/v2/keyring - пример пути до kds

Разблокировка

Расшифровывает зашифрованный Keyring, что позволяет производить операции с хранилищем зашифрованных карточных данных.

Разделен на 2 этапа: Начало и Валидация.

На этапе 'Начало' вызывается метод начала операции.

На этапе 'Валидация' владельцы фрагментов мастер-ключа отправляют фрагменты в виде JWS, подписанного криптоключом. Собранные фрагменты востанавливают мастер-ключ и расшифровывают Keyring. В случае успеха последнему отправившему фрагмент вернется Success и расшифрованный Keyring сохраняется в памяти. Если не удается востановить MasterKey из фрагментов или востановленным ключом не получается расшифровать Keyring, то процесс разблокировки прерывается и необходимо начинать с этапа 'Начало'.

Начало

Начинаем процесс разблокировки:

$ woorl -s cds_proto/proto/keyring.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement StartUnlock

Подтверждение

Threshold владельцев фрагментов ключа расшифровывают свою часть, подписывают и отдают на подтверждение:

$ echo "<insert EncryptedMasterKeyShare here>" | \
  step crypto jwe decrypt --key rsa-enc.json | \
  step crypto jws sign - --key ec.json | \
  woorl -s cds_proto/proto/keyring.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement ConfirmUnlock '{"id":"<insert id, ex. ndiezel>","signed_share":"'"$(cat -)"'"}'

EncodedMasterKeyShare - полученный зашифрованный фрагмент мастер-ключа

http://kds:8022/v2/keyring - пример пути до kds

Ротация ключа шифрования карточных данных

Создание нового ключа для шифрования карточных данных и добавление его в Keyring.

Разделен на 2 этапа: Начало и Валидация.

На этапе 'Начало' вызывается метод начала операции.

На этапе Валидация владельцы фрагментов мастер-ключа отправляют фрагменты в виде JWS, подписанного криптоключом. Собранные фрагменты востанавливают мастер-ключ и расшифровывают Keyring. В случае успеха последнему отправившему свой фрагмент держателю вернется Success и новый добавленный в Keyring ключ будет использоваться для последующих операций шифрования карточных данных. Если не удается востановить MasterKey из фрагментов или востановленным ключом не получается расшифровать Keyring, то процесс Ротации прерывается и необходимо начинать с этапа 'Начало'.

Начало

Начинаем процесс ротации:

$ woorl -s cds_proto/proto/keyring.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement StartRotate

Подтверждение

Threshold владельцев фрагментов ключа расшифровывают свою часть, подписывают и отдают на подтверждение:

$ echo "<insert EncryptedMasterKeyShare here>" | \
  step crypto jwe decrypt --key rsa-enc.json | \
  step crypto jws sign - --key ec.json | \
  woorl -s cds_proto/proto/kds.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement ConfirmRotate '{"id":"<insert id, ex. ndiezel>","signed_share":"'"$(cat -)"'"}'

EncodedMasterKeyShare - полученный зашифрованный фрагмент мастер-ключа

http://kds:8022/v2/keyring - пример пути до kds

Замена ключа шифрования Keyring

Перегенерация MasterKey, используемого для шифрования keyring, разделение на количество фрагментов, равное количеству shareholders, указанных в файле конфигурации, и отдача держателям указаным в shareholders.

Разделен на 4 этапа: Начало, Подтверждение, Постподтверждение и Валидация

На этапе 'Начало' указывается количество фрагментов ключа, при комбинации которых получается MasterKey, который шифрует Keyring.

На этапе 'Подтверждение' владельцы фрагментов мастер-ключа отправляют фрагменты текущего ключа в виде JWS, подписанного криптоключом. Собранные фрагменты востанавливают мастер-ключ и расшифровывают Keyring. В случае успеха последнему, отправившему фрагмент, вернется Success и осуществится переход на этап 'Постподтверждение'. Если не удается востановить MasterKey из фрагментов или востановленным ключом не получается расшифровать Keyring, то процесс замены ключа прерывается и необходимо начинать с этапа 'Начало'.

На этапе 'Постподтверждение' получаются зашифрованные публичными ключами из конфигурации фрагменты MasterKey, которые отдаются соответствующим владельцам для прохождения этапа 'Валидация'.

На этапе 'Валидация' каждый владелец ключа передает свой расшифрованный фрагмент ключа в виде JWS, подписанного личным криптоключом. Этап 'Замена ключа' можно считать завершенным, когда последнему владельцу приходит struct Success {}.

Начало

Начинаем процесс замены ключа:

$ woorl -s cds_proto/proto/kds.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement StartRekey '<insert threshold here>'

threshold - количество фрагментов мастер-ключа, которое нужно для его востановление

Подтверждение

Threshold владельцев фрагментов ключа расшифровывают свою часть, подписывают и отдают на подтверждение:

$ echo "<insert EncryptedMasterKeyShare here>" | \
  step crypto jwe decrypt --key rsa-enc.json | \
  step crypto jws sign - --key ec.json | \
  woorl -s cds_proto/proto/keyring.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement ConfirmRekey '{"id":"<insert id, ex. ndiezel>","signed_share":"'"$(cat -)"'"}'

EncodedMasterKeyShare - полученный зашифрованный фрагмент мастер-ключа

http://kds:8022/v2/keyring - пример пути до kds

Постподтверждение

Получаем зашифрованные фрагменты мастер-ключа.

$ woorl -s cds_proto/proto/keyring.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement StartRekeyValidation

Пример получаемых фрагментов:

[
  {
    "id": "ndiezel",
    "owner": "ndiezel0@gmail.com",
    "encrypted_share": "<EncryptedMasterKeyShare>"
  }
]

Валидация

Threshold владельцев фрагментов ключа расшифровывают свою часть, подписывают и отдают на валидацию:

$ echo "<insert EncryptedMasterKeyShare here>" | \
  step crypto jwe decrypt --key rsa-enc.json | \
  step crypto jws sign - --key ec.json | \
  woorl -s cds_proto/proto/keyring.thrift \
   'http://kds:8022/v2/keyring' \
   KeyringManagement ValidateRekey '{"id":"<insert id, ex. ndiezel>","signed_share":"'"$(cat -)"'"}'

EncodedMasterKeyShare - полученный зашифрованный фрагмент мастер-ключа

http://kds:8022/v2/keyring - пример пути до kds