2015-04-29 9 views
17

Tôi có ECG ASG trên AWS và tôi quan tâm đến việc lưu trữ tập lệnh shell được sử dụng để khởi tạo bất kỳ phiên bản nào trong thùng S3 và tải xuống và chạy khi khởi tạo, nhưng tất cả đều cảm thấy một chút ầm ĩ mặc dù tôi ' m bằng cách sử dụng một số IAM Instance Role, chuyển qua HTTPS và mã hóa chính tập lệnh trong khi ở phần còn lại trong thùng S3 sử dụng KMS sử dụng S3 Server Side Encryption (because the KMS method was throwing an 'Unknown' error).

Có an toàn để lưu trữ các tập lệnh shell User-Data của EC2 trong một thùng S3 riêng tư không?

Setup

  • Tạo một IAM Instance Role đó được gán cho bất kỳ trường hợp trong ASG của tôi khi instantiation, dẫn đến creds AWS tôi bị nướng vào dụ như ENV vars
  • được tải lên và đã mã hóa tập lệnh Instance-Init.sh mã hóa của tôi thành S3, kết quả là điểm cuối riêng tư như sau: https://s3.amazonaws.com/super-secret-bucket/Instance-Init.sh

In The User-Data Dòng

tôi nhập sau vào trường User Data khi tạo Launch Configuration Tôi muốn ASG tôi để sử dụng:

#!/bin/bash 

apt-get update 
apt-get -y install python-pip 
apt-get -y install awscli 
cd /home/ubuntu 
aws s3 cp s3://super-secret-bucket/Instance-Init.sh . --region us-east-1 
chmod +x Instance-Init.sh 
. Instance-Init.sh 
shred -u -z -n 27 Instance-Init.sh 

Trên đây nào sau đây:

  • Cập nhật danh sách gói
  • Cài đặt Python (cần thiết để chạy aws-cli)
  • Cài đặt aws-cli
  • thay đổi vào thư mục /home/ubuntu dùng
  • Sử dụng aws-cli để tải về các tập tin Instance-Init.sh từ S3. Do số IAM Role được gán cho ví dụ của tôi, tín dụng AWS của tôi được tự động phát hiện bởi aws-cli. IAM Role cũng cấp cho cá thể của tôi các quyền cần thiết để giải mã tệp.
  • Làm cho nó thực thi
  • Chạy kịch bản
  • Xóa kịch bản sau khi nó được hoàn thành.

Các Instance-Init.sh Script

Kịch bản thân sẽ làm những thứ như thiết env vars và docker run các container mà tôi cần phải triển khai trên ví dụ của tôi.Kinda như vậy:

#!/bin/bash 

export MONGO_USER='MyMongoUserName' 
export MONGO_PASS='Top-Secret-Dont-Tell-Anyone' 

docker login -u <username> -p <password> -e <email> 
docker run - e MONGO_USER=${MONGO_USER} -e MONGO_PASS=${MONGO_PASS} --name MyContainerName quay.io/myQuayNameSpace/MyAppName:latest 


Rất Handy

Điều này tạo ra một cách rất tiện dụng để cập nhật User-Data kịch bản mà không cần phải tạo ra một mới Launch Config mỗi khi bạn cần phải thực hiện trẻ vị thành niên thay đổi. Và nó thực hiện một công việc tuyệt vời khi nhận được env vars ra khỏi cơ sở mã của bạn và vào một không gian hẹp, có thể điều khiển (chính kịch bản Instance-Init.sh).

Nhưng tất cả đều cảm thấy một chút không an toàn. Ý tưởng về việc đưa DB của tôi vào một tập tin trên S3 là đáng lo ngại khi nói ít nhất.

Các câu hỏi

  1. Đây có phải là một thực tế phổ biến hay tôi đang mơ lên ​​một ý tưởng tồi đây?
  2. Thực tế là tệp được tải xuống và lưu trữ (mặc dù một thời gian ngắn) trên cá thể mới tạo thành một lỗ hổng ở tất cả?
  3. Có phương pháp nào tốt hơn để xóa tệp theo cách an toàn hơn không?
  4. Thậm chí liệu tệp có bị xóa sau khi chạy không? Xem xét những bí mật đang được chuyển giao cho env vars nó gần như có vẻ dư thừa để xóa các tập tin Instance-Init.sh.
  5. Có điều gì đó tôi thiếu trong những ngày đầu tiên của tôi về ops không?

Nhờ sự giúp đỡ trước.

+0

Tôi không thuộc phạm vi chính xác của trang web nhưng điều này * có thể * phù hợp hơn trên https://security.stackexchange.com/. –

+0

Tôi đồng ý rằng điều này nên đi đến security.stackexchange.com. Không cần phải nói, khó khăn, đặt bất kỳ thông tin đăng nhập nào vào bất kỳ tệp văn bản thô nào ở bất kỳ đâu là một nguy cơ bảo mật lớn. Không bao giờ làm điều đó. Không bao giờ. Nếu có thể, hãy yêu cầu thông tin đăng nhập từ đầu vào của người dùng thông qua thiết bị đầu cuối hoặc tìm ra cách khác để thực hiện. – nln

+0

Nó có thể là một 'phù hợp hơn' cho InfoSec, nhưng tôi muốn nói sự phổ biến cho đến nay có nghĩa là nó nên ở lại đây. Vox Populi đã bình chọn với phiếu bầu của họ! – AJB

Trả lời

5

Những gì bạn đang mô tả là gần như chính xác những gì chúng ta đang sử dụng để nhanh chóng container Docker từ registry của chúng tôi (bây giờ chúng tôi sử dụng v2 tự lưu trữ/tin, s3 hậu thuẫn Docker-registry thay vì Quay) vào sản xuất. FWIW, tôi đã có cảm giác "cảm giác uể oải" này khi bạn lần đầu tiên giẫm lên con đường này, nhưng sau gần một năm làm việc đó - và so với việc thay thế lưu trữ dữ liệu cấu hình nhạy cảm này trong repo hoặc nướng vào hình ảnh - Tôi tự tin rằng đó là một trong những cách xử lý dữ liệu này tốt hơn. Bây giờ, điều đó đang được nói, chúng tôi hiện đang xem xét việc sử dụng Hashicorp's new Vault software để triển khai các bí mật cấu hình để thay thế thùng chứa tệp được mã hóa bí mật "được chia sẻ" này (nói nhanh gấp năm lần). Chúng tôi cho rằng Vault sẽ tương đương với mật mã gia công phần mềm cho cộng đồng nguồn mở (nơi nó thuộc về), nhưng đối với lưu trữ cấu hình.

Trong ít từ hơn, chúng tôi đã không gặp phải nhiều vấn đề với một tình huống tương tự như chúng tôi đã sử dụng trong khoảng một năm, nhưng hiện tại chúng tôi đang xem xét sử dụng dự án nguồn mở bên ngoài (Vault của Hashicorp) phương pháp cây nhà lá vườn. Chúc may mắn!

+2

Yup. Đó là vé. Cảm ơn @ L0j1k, đó chính xác là câu trả lời tôi đang tìm kiếm. Nó chỉ * cảm thấy * sai, eh? Nhưng dù sao, tuyệt vời khi biết rằng tôi không mạo hiểm ra ngoài lãnh thổ hoàn toàn không rõ. Vault trông giống như một trò lừa bịp 'etcd', rất, rất tuyệt. Tôi thích khái niệm 'Bí mật động '. Gonna đi đọc trang web của họ ngay bây giờ. Chúc mừng. – AJB

+1

Bật. Đối với cá nhân tôi, tôi biết chúng tôi đã đi đúng hướng vào phút tôi thấy dự án Vault của Hashicorp, bởi vì nó rất giống với cách bạn và tôi đang giải quyết vấn đề này. Xác nhận, nếu bạn muốn. :) – L0j1k

+1

Yup. Suy nghĩ của tôi về quản lý tín dụng đã thay đổi đáng kể. Tôi đã từng nghĩ về các tín hiệu như các đối tượng độc lập nổi từ người dùng đến người dùng. Bây giờ tôi xem chúng như một sản phẩm phụ của một 'Lớp bí mật' được thiết kế cẩn thận. Mà làm giảm bề mặt tấn công cho các creds rất nhiều. Tôi đã quản lý để có được tất cả trong một chỗ thông qua hack này 'S3', nhưng tôi đã không chắc chắn làm thế nào để làm cho họ năng động. Vault dường như giải quyết vấn đề này rất độc đáo. – AJB

1

Một thay thế cho Vault là sử dụng credstash, sử dụng AWS KMS và DynamoDB để đạt được mục tiêu tương tự. Tôi thực sự sử dụng credstash để tự động nhập dữ liệu cấu hình nhạy cảm khi khởi động vùng chứa thông qua một tập lệnh nhập cảnh đơn giản - theo cách này, dữ liệu nhạy cảm không được hiển thị qua kiểm tra docker hoặc trong nhật ký docker, v.v.

Đây là tập lệnh nhập cảnh mẫu (đối với ứng dụng Python) - vẻ đẹp ở đây là bạn vẫn có thể chuyển thông tin xác thực qua biến môi trường cho môi trường không AWS/dev.

#!/bin/bash 
set -e 

# Activate virtual environment 
. /app/venv/bin/activate 

# Pull sensitive credentials from AWS credstash if CREDENTIAL_STORE is set with a little help from jq 
# AWS_DEFAULT_REGION must also be set 
# Note values are Base64 encoded in this example 
if [[ -n $CREDENTIAL_STORE ]]; then 
    items=$(credstash -t $CREDENTIAL_STORE getall -f json | jq 'to_entries | .[]' -r) 
    keys=$(echo $items | jq .key -r) 
    for key in $keys 
    do 
    export $key=$(echo $items | jq 'select(.key=="'$key'") | .value' -r | base64 --decode) 
    done 
fi 

exec [email protected] 
+0

Rất hay. Cảm ơn mẹo, @mixja. Tình yêu như thế nào nó "giấu" các creds từ docker kiểm tra/nhật ký. – AJB

Các vấn đề liên quan