Salt là một công cụ quản lý cấu hình mạnh mẽ giúp bạn quản lý việc triển khai máy chủ của mình bằng các tệp trạng thái cấu hình . Các tệp này dễ dàng được chia sẻ với những người khác trong nhóm của bạn và có thể được kiểm tra trong các hệ thống kiểm soát phiên bản như Git.
Một vấn đề thường gặp khi làm việc với các tệp trạng thái của Salt là cần truy cập vào dữ liệu nhạy cảm, như khóa API và mật khẩu cơ sở dữ liệu, trong các tệp đó. Việc nhúng trực tiếp thông tin đó dưới dạng văn bản thuần túy bên trong các tệp trạng thái của bạn có thể gây ra lỗ hổng bảo mật, đặc biệt là nếu bạn kiểm tra các tệp đó trong kiểm soát phiên bản. Hướng dẫn này sẽ khám phá một số phương pháp phổ biến để bảo mật bí mật của bạn trong Salt.
Salt Pillar
Một phương pháp chính để lưu trữ bí mật trong Salt là giữ chúng trong tính năng Pillar của Salt . Salt Pillar được thiết kế để duy trì bí mật và thông tin biến đổi khác ở một vị trí duy nhất (thường là trên Salt master) và sau đó cung cấp thông tin đó cho các minion cụ thể. Nếu bạn tách bí mật của mình ra khỏi các trạng thái và vào các tệp trụ cột, bạn có thể bỏ qua các tệp đó trong hệ thống kiểm soát phiên bản của mình.
Ghi chú:Ngoài việc lưu trữ bí mật, Salt Pillar cũng có thể duy trì dữ liệu không nhạy cảm; ví dụ, các phiên bản của các gói bạn muốn cài đặt trên minion của mình. Vì vậy, bạn vẫn có thể muốn theo dõi một số tệp trụ cột trong kiểm soát phiên bản.
Để xử lý sự khác biệt này, bạn có thể tạo một thư mục đặc biệt tại /srv/pillar/secrets
và thêm thiết lập hệ thống kiểm soát phiên bản của bạn để bỏ qua thư mục đó (khi sử dụng Git, hãy liệt kê thư mục này trong .gitignore
tệp của bạn). Giữ tất cả dữ liệu nhạy cảm bên trong các tệp trụ cột trong thư mục này và duy trì dữ liệu không nhạy cảm trong các tệp trụ cột trong /srv/pillar
hoặc một thư mục con khác.
Giải phẫu của các tập tin dữ liệu trụ cột
Dữ liệu trụ cột được lưu trong .sls
các tệp được viết theo cùng cú pháp YAML như các trạng thái. Chúng thường được lưu trữ trong /srv/pillar
máy chủ Salt, nhưng vị trí này có thể được cấu hình thông qua pillar_roots
tùy chọn trong cấu hình máy chủ của bạn.
Ví dụ, giả sử minion của bạn chạy một ứng dụng truy cập API Linode . Tệp trụ cột ví dụ này ghi lại mã thông báo API của bạn trong một biến có tên là linode_api_token
:
linode_api_token: YOUR_API_TOKEN
Giống như các tệp trạng thái, tệp top (riêng với tệp top của trạng thái) ánh xạ dữ liệu trụ cột tới các minion. Ví dụ tệp top này ánh xạ dữ liệu app_secrets
trụ cột của bạn tới máy chủ ứng dụng của bạn:
base:
'appserver':
- app_secrets
Ghi chú: Bạn có thể muốn tạo một pillar.example
tệp (giống như những tệp do Salt formulas cung cấp) liệt kê tất cả các khóa biến đã biết cho trụ cột của bạn nhưng không chứa các bí mật thực tế. Nếu bạn kiểm tra tệp này trong kiểm soát phiên bản của mình, những người dùng khác sao chép kho lưu trữ trạng thái của bạn có thể sao chép tệp trụ cột mẫu này và thiết lập triển khai của riêng họ nhanh hơn.
Truy cập dữ liệu Pillar bên trong Salt States
Để đưa dữ liệu trụ cột vào trạng thái của bạn, hãy sử dụng cú pháp mẫu Jinja của Salt. Trong khi Salt sử dụng cú pháp YAML cho các tệp trạng thái và trụ cột, các tệp này trước tiên được diễn giải là các mẫu Jinja (theo mặc định).
Trạng thái ví dụ này nhúng mã thông báo API vào một tệp trên Linode của bạn; dữ liệu được truy cập thông qua pillar
từ điển:
api_token:
file.managed:
- name: /var/your_app/api_token
- contents: {{ pillar['linode_api_token'] }}
Quan trọng: Có những lúc dữ liệu trụ cột có thể hiển thị trong đầu ra mà Salt tạo ra, như khi file.managed
hiển thị sự khác biệt của một tệp đã sửa đổi. Để tránh hiển thị những sự khác biệt này, bạn có thể đặt cờ file.managed
‘ show_diff
thành false.
Truyền dữ liệu Pillar tại dòng lệnh
Bạn cũng có thể cung cấp các giá trị trụ cột dưới dạng từ điển thông qua dòng lệnh và các giá trị đó sẽ ghi đè lên bất kỳ giá trị nào được đặt trong các tệp trụ cột của bạn. Lệnh ví dụ này sẽ áp dụng giá A_DIFFERENT_API_TOKEN
trị thay vì giá trị gốc YOUR_API_TOKEN
từ ví dụ trước:
salt '*' state.apply pillar='{"linode_api_token": "A_DIFFERENT_API_TOKEN"}'
Biến môi trường
Một cách khác để giữ các giá trị nhạy cảm ngoài tầm kiểm soát phiên bản là sử dụng biến môi trường. Phương pháp truyền biến môi trường cho các trạng thái của bạn tương tự như cách dữ liệu trụ cột có thể được truyền qua dòng lệnh. Biến môi trường đặt tiền tố cho lệnh salt của bạn, như trong ví dụ này:
LINODE_API_TOKEN="YOUR_API_TOKEN" salt 'appserver' state.apply setup_app
Biến môi trường được tham chiếu bởi tệp trạng thái Salt thông qua salt['environ.get']('ENVIRONMENT_VARIABLE_NAME')
cú pháp. setup_app
Trạng thái ví dụ trước có thể được điều chỉnh để sử dụng biến môi trường như sau:
api_token:
file.managed:
- name: /var/your_app/api_token
- contents: {{ salt['environ.get']('LINODE_API_TOKEN') }}
Tương tự như ví dụ về trụ cột trước, bạn sẽ muốn giữ file.managed
‘s diffs không xuất hiện trên màn hình khi xử lý thông tin nhạy cảm bằng cách thiết lập show_diff: false
. Để biết thêm thông tin, hãy xem Sử dụng Biến môi trường trong Mô-đun SLS .
Mã hóa GPG
Bạn có thể sử dụng trình kết xuất GPG của Salt để giải mã các mã hóa GPG nằm trong các tệp trụ cột của bạn. Bước giải mã này diễn ra trước khi dữ liệu trụ cột của bạn được chuyển đến các minion của bạn. Do đó, bất kỳ giá trị nào trong tệp trụ cột đều có thể được mã hóa. Vì các giá trị được mã hóa, bạn có thể lưu trữ các tệp trụ cột của mình trong kiểm soát phiên bản một cách an toàn.
Cách tiếp cận này yêu cầu khóa bí mật GPG được lưu trữ trên máy chủ Salt của bạn. Cũng hợp lý khi đưa khóa công khai vào kiểm soát phiên bản để các thành viên trong nhóm của bạn có thể sử dụng khóa này để mã hóa dữ liệu mới cho các tệp trụ cột của bạn.
Ngân hàng
Salt đi kèm với một giao diện cơ sở dữ liệu có tên là SDB , ban đầu được tạo ra để lưu trữ dữ liệu không dành riêng cho minion, chẳng hạn như mật khẩu. Nó được thiết kế để kết nối với một gói như mô- đun móc khóa của Salt , nhưng cũng có các tùy chọn khác, chẳng hạn như Consul và Vault .
Các cơ sở dữ liệu này được thiết lập bằng cách sử dụng cấu hình trong /srv/salt/master.d
. Để truy cập dữ liệu, bạn cung cấp một sdb://
url, chẳng hạn như password: sdb://mysecrets/mypassword
. Để biết thêm thông tin về SDB, hãy tham khảo tài liệu Salt SDB .
Ghi chú: Salt cũng cung cấp một mô-đun cho phép lưu trữ dữ liệu trụ cột trong Vault , cũng như một mô-đun thực thi bao gồm các chức năng để tương tác với Vault .
Thông tin thêm
Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.
- Hướng dẫn xây dựng Salt Pillar
- Sử dụng Biến Môi trường trong Mô-đun SLS
- Máy kết xuất muối GPG
- Tài liệu Salt SDB
- Mô-đun SDB muối
Nguồn: https://www.linode.com/docs/guides/secrets-management-with-salt/