cloud-init_lin.tpl.yaml 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #cloud-config
  2. #ssh_pwauth: no
  3. users:
  4. - name: yc-user
  5. sudo: ALL=(ALL) NOPASSWD:ALL
  6. groups: sudo
  7. shell: /bin/bash
  8. ssh_authorized_keys:
  9. - "${ssh_key}"
  10. packages:
  11. - awscli
  12. - cryptsetup-bin
  13. - curl
  14. package_update: true
  15. write_files:
  16. - content: |
  17. #!/usr/bin/env bash
  18. #
  19. # Клиентское шифрование диска на ключе из YC KMS
  20. #
  21. set -e -x
  22. YC=~/yandex-cloud/bin/yc
  23. CMD="$1"
  24. case "$CMD" in
  25. create)
  26. #Создание ключа с высокой энтропией метод generateDataKey (https://cloud.yandex.ru/docs/kms/api-ref/SymmetricCrypto/generateDataKey)
  27. #Необходимо выполнить 1 раз и хранить ENCRYPTED_DEK_FILE в защищенном удаленном месте
  28. mkdir ${MOUNT}
  29. $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}
  30. cryptsetup -v --type luks --cipher aes-xts-plain64 --key-size 512 --hash sha256 --iter-time 2000 --use-urandom -q luksFormat "${DEVICE}" "${PLAINTEXT_DEK_FILE}"
  31. cat "${PLAINTEXT_DEK_FILE}" | cryptsetup open "${DEVICE}" "${MAPPED_DEVICE}" -d -
  32. mkfs -t ext4 "/dev/mapper/${MAPPED_DEVICE}"
  33. aws --endpoint-url=https://storage.yandexcloud.net s3 cp ${ENCRYPTED_DEK_FILE} s3://${BUCKET_NAME}/encrypted1_dek.enc #копируем ключ в S3
  34. rm ${PLAINTEXT_DEK_FILE} # удаляем расшифрованный ключ
  35. rm ${ENCRYPTED_DEK_FILE} # удаляем зашифрованный ключ
  36. ;;
  37. #Монтирование зашифрованного диска в расшифрованный объект
  38. #Можно выполнять, например при старте ОС
  39. open)
  40. aws --endpoint-url=https://storage.yandexcloud.net s3 cp s3://${BUCKET_NAME}/encrypted1_dek.enc ${ENCRYPTED_DEK_FILE}
  41. #Вывод plaintext-file для расшифровки
  42. $YC kms symmetric-crypto decrypt --id ${KMS_KEY_ID} --ciphertext-file=${ENCRYPTED_DEK_FILE} --plaintext-file=${PLAINTEXT_DEK_FILE}
  43. cat "${PLAINTEXT_DEK_FILE}" | cryptsetup open "${DEVICE}" "${MAPPED_DEVICE}" -d -
  44. rm ${PLAINTEXT_DEK_FILE} # удаляем расшифрованный ключ
  45. rm ${ENCRYPTED_DEK_FILE} # удаляем зашифрованный ключ
  46. mount -t ext4 "/dev/mapper/${MAPPED_DEVICE}" ${MOUNT}
  47. ;;
  48. #Размонтирование зашифрованного устройства
  49. close)
  50. umount ${MOUNT}
  51. cryptsetup close ${MAPPED_DEVICE}
  52. ;;
  53. #Удаление исходного устройства
  54. erase)
  55. cryptsetup luksErase ${DEVICE}
  56. ;;
  57. *)
  58. exit 3
  59. ;;
  60. esac
  61. path: /home/yandex-cloud/script-enc.sh
  62. permissions: '0777'
  63. - content: |
  64. [Unit]
  65. Description=Template Settings Service
  66. After=network.target
  67. [Service]
  68. Type=oneshot
  69. User=root
  70. ExecStart=/home/yandex-cloud/script-enc.sh open
  71. [Install]
  72. WantedBy=multi-user.target
  73. path: /etc/systemd/system/test-script.service
  74. permissions: '664'
  75. runcmd:
  76. - export HOME=/root
  77. - cd /home/yandex-cloud
  78. - curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash > /home/yandex-cloud/log.log
  79. - sleep 10
  80. - source "/root/.bashrc"
  81. - aws configure set aws_access_key_id "${aws_key}"
  82. - aws configure set aws_secret_access_key "${aws_sec}"
  83. - aws configure set default.region ru-central1
  84. - /home/yandex-cloud/script-enc.sh create
  85. - sleep 20
  86. - systemctl daemon-reload
  87. - systemctl start test-script.service
  88. - systemctl enable test-script.service
  89. - reboot