script.sh 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/usr/bin/env bash
  2. #
  3. # Клиентское шифрование диска на ключе из YC KMS
  4. #
  5. set -e -x
  6. DEVICE="/dev/vdb" #заменить имя диска на свое (по умолчанию 2-й диск vdb)
  7. MAPPED_DEVICE="encrypted1"
  8. KMS_KEY_ID="abjhdahmqnxxxxxxxxxx" #заменить на свой KMS key id
  9. ENCRYPTED_DEK_FILE="./encrypted1_dek.enc" # persistent FS
  10. PLAINTEXT_DEK_FILE="/tmp/encrypted1.dek" # in-memory FS
  11. MOUNT="/mnt/${MAPPED_DEVICE}"
  12. BUCKET_NAME="bucket-enc" #заменить на свой
  13. YC=~/yandex-cloud/bin/yc
  14. CMD="$1"
  15. case "$CMD" in
  16. create)
  17. #Создание ключа с высокой энтропией метод generateDataKey (https://cloud.yandex.ru/docs/kms/api-ref/SymmetricCrypto/generateDataKey)
  18. #Необходимо выполнить 1 раз и хранить ENCRYPTED_DEK_FILE в защищенном удаленном месте
  19. mkdir $MOUNT
  20. $YC kms symmetric-crypto generate-data-key --id ${KMS_KEY_ID} --data-key-spec=aes-256 --data-key-ciphertext-file=${ENCRYPTED_DEK_FILE} --data-key-plaintext-file=${PLAINTEXT_DEK_FILE}
  21. cryptsetup -v --type luks --cipher aes-xts-plain64 --key-size 512 --hash sha256 --iter-time 2000 --use-urandom -q luksFormat "${DEVICE}" "${PLAINTEXT_DEK_FILE}"
  22. cat "${PLAINTEXT_DEK_FILE}" | cryptsetup open "${DEVICE}" "${MAPPED_DEVICE}" -d -
  23. mkfs -t ext4 "/dev/mapper/${MAPPED_DEVICE}"
  24. aws --endpoint-url=https://storage.yandexcloud.net s3 cp ${ENCRYPTED_DEK_FILE} s3://${BUCKET_NAME}/encrypted1_dek.enc #копируем ключ в S3
  25. rm ${PLAINTEXT_DEK_FILE} # удаляем расшифрованный ключ
  26. rm ${ENCRYPTED_DEK_FILE} # удаляем зашифрованный ключ
  27. ;;
  28. #Монтирование зашифрованного диска в расшифрованный объект
  29. #Можно выполнять, например при старте ОС
  30. open)
  31. aws --endpoint-url=https://storage.yandexcloud.net s3 cp s3://${BUCKET_NAME}/encrypted1_dek.enc ${ENCRYPTED_DEK_FILE}
  32. #Вывод plaintext-file для расшифровки
  33. $YC kms symmetric-crypto decrypt --id ${KMS_KEY_ID} --ciphertext-file=${ENCRYPTED_DEK_FILE} --plaintext-file=${PLAINTEXT_DEK_FILE}
  34. cat "${PLAINTEXT_DEK_FILE}" | cryptsetup open "${DEVICE}" "${MAPPED_DEVICE}" -d -
  35. rm ${PLAINTEXT_DEK_FILE} # удаляем расшифрованный ключ
  36. rm ${ENCRYPTED_DEK_FILE} # удаляем зашифрованный ключ
  37. mount -t ext4 "/dev/mapper/${MAPPED_DEVICE}" $MOUNT
  38. mount /dev/mapper/$MAPPED_DEVICE $MOUNT
  39. ;;
  40. #Размонтирование зашифрованного устройства
  41. close)
  42. umount ${MOUNT}
  43. cryptsetup close ${MAPPED_DEVICE}
  44. rm "${PLAINTEXT_DEK_FILE}"
  45. ;;
  46. #Удаление исходного устройства
  47. erase)
  48. cryptsetup luksErase ${DEVICE}
  49. ;;
  50. *)
  51. echo "Usage: ${NAME} {create|open|close|erase}" >&2
  52. exit 3
  53. ;;
  54. esac