फ़ाइलों में क्रेडेंशियल्स को संग्रहीत करने से बचने के दौरान मैं अंसिबल एज़्योर प्लेबुक कैसे चलाऊं?


13

पृष्ठभूमि

  1. हम एज़्योर इन्फ्रास्ट्रक्चर को प्रबंधित करने और प्रबंधित करने के लिए Ansible का उपयोग करते हैं। फिलहाल हम Ansible "मैन्युअल रूप से" चलाते हैं अर्थात हम विभिन्न स्वचालित कार्यों के लिए मैन्युअल रूप से playbooks निष्पादित करते हैं। कोई CI इंफ्रास्ट्रक्चर नहीं।
  2. शायद प्रासंगिक नहीं है लेकिन हम गतिशील स्क्रिप्ट का उपयोग करके अपनी इन्वेंट्री का प्रबंधन करते हैं azure_rm.py
  3. हमें यथासंभव सुरक्षित रहने के लिए प्रोत्साहित किया जाता है
    1. तिजोरी के पासवर्ड ~/.vault_passया किसी भी स्थानीय फ़ाइल में संग्रहीत न करें
    2. Azure रहस्यों को स्टोर न करें ~/.azure/credentials
    3. कुछ भी सुरक्षित न रखें .bashrc

ऐसे में, मुझे यह सुनिश्चित करने में एक सुसंगत रणनीति के साथ आने में परेशानी हो रही है कि ऊपर दिए गए दिशानिर्देशों का पालन करते हुए मेरी प्लेबुक एज़्योर रहस्यों तक पहुंच सकती है।

सवाल

मैं फ़ाइलों पर Ansible वॉल्ट और एज़्योर क्रेडेंशियल्स को संग्रहीत करने से कैसे बच सकता हूं, जबकि अभी भी यह सुनिश्चित करना कि मेरी प्लेबुक उन्हें एक्सेस कर सकती है?

मैंने क्या कोशिश की है

अब तक मैं एक रैपर स्क्रिप्ट के साथ आया हूं जो कि

  1. उपयोगकर्ता से वॉल्ट पासवर्ड मांगता है
  2. एक वॉल्टेड शेल स्क्रिप्ट को डिक्रिप्ट करने के लिए उपयोग करता है
  3. स्क्रिप्ट का मूल्यांकन करता है, जो एज़्योर पर्यावरण चर को पर्यावरण में लोड करता है;
  4. पर्यावरण पर प्लेबुक चलाता है जो इस प्रकार सेट किया गया है।

किसी भी बेहतर (अधिक सुरुचिपूर्ण, कम जटिल, अधिक "Ansible") समाधान वहाँ?


इस वर्कफ़्लो में आपको सबसे अधिक क्या परेशान करता है?
कॉन्सटेंटिन सुवोरोव

1
@KonstantinSuvorov मुख्य रूप से यह हुप्स की संख्या है जिसे अनुपालन करने के लिए मुझे कूदने की आवश्यकता है (कम से कम मुझे लगता है) अनुपालन-भारी उद्यमों में एक काफी सामान्य आवश्यकता है।
विश

जवाबों:


8

तिजोरी का पासवर्ड

सबसे पहले, आपको इस तथ्य से परिचित होना चाहिए कि वॉल्ट पासवर्ड फ़ाइल निष्पादन योग्य स्क्रिप्ट हो सकती है। इस मामले में Ansible इसे निष्पादित करता है और इसके आउटपुट के रूप में पासवर्ड प्राप्त करने की अपेक्षा करता है।

उदाहरण के लिए आप अपने वास्तविक पासवर्ड को स्टोर gpg-agentया उपयोग कर सकते keychainहैं और आवश्यकता होने पर अनलॉक कर सकते हैं । इस ब्लॉग पोस्ट में और पढ़ें: https://benincosa.com/?p=3235

यदि आप थोड़ा पागल हैं, तो आप अपनी पासवर्ड स्क्रिप्ट को कॉल करते समय अधिसूचना जोड़ सकते हैं, जैसे:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

यह वॉल्ट पासवर्ड स्क्रिप्ट key.gpgवास्तविक वॉल्ट कुंजी के रूप में उपयोग करता है और स्क्रिप्ट का उपयोग करने पर मूल प्रक्रिया नाम के साथ पॉपअप अधिसूचना (मैकओएस के लिए) भी दिखाता है। Gpg- एजेंट कैश कुछ समय के लिए पासवर्ड अनलॉक करते हैं, इसलिए हर बार जब आप प्लेबुक शुरू करते हैं तो पासवर्ड दर्ज करने की आवश्यकता नहीं होती है।

बस vault_password_file = ./vault_pass.shअपने में सेट है ansible.cfg

वातावरण

आपने कहा कि आप azure_rm.pyडायनेमिक इन्वेंट्री स्क्रिप्ट के रूप में उपयोग करते हैं । इसका मतलब यह है कि आपको अपने पर्यावरण चर में क्रेडेंशियल सेट करना होगा, इससे पहले कि आप उन्हें उपयोग करने में सक्षम होने के लिए स्वयं-प्लेबुक शुरू करें।

आप दो फाइलें बना सकते हैं:

secure_env (तिजोरी से एन्क्रिप्टेड):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (सादे पाठ):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

जब आप अपने स्वचालन कार्यों को निष्पादित करने के लिए नया टर्मिनल खोलते हैं, तो आपको दौड़ना होगा:

source set_env

इस समय, बैश मूल्यांकन करता है set_envऔर secure_env(ansible-vault के माध्यम से डिक्रिप्टेड)। इस आदेश के बाद आपके पास वर्तमान शेल के लिए एज़्योर क्रेडेंशियल्स परिभाषित हैं, इसलिए आप हमेशा की तरह प्लेबुक निष्पादित कर सकते हैं:

ansible-playbook provision-my-azure-instances.yml

तो इस दो दृष्टिकोणों का उपयोग करते हुए, आप स्टोर कर सकते हैं key.gpgऔर secure_envअपने भंडार में; फिर source set_envएक बार नए टर्मिनल कॉल में , एक बार gpg पासवर्ड दर्ज करें (key.gpg के भविष्य के उपयोग को अनलॉक करने के लिए); फिर ansible-playbookबिना किसी पासवर्ड के जितनी बार चाहें कॉल करें ।


जवाब देने के लिए धन्यवाद। मुझे इस सप्ताह के बाहर की कोशिश करते हैं।
Vish

तो मेरे मूल दृष्टिकोण पर मुख्य लाभ यह है कि यह GPG का उपयोग करता है - जो कैशिंग लाभ लाता है --- सही? पर्यावरण का दृष्टिकोण मेरे साथ आया जैसा है।
Vish

1
आपके ओपी से मैं समझता हूं कि जब आप प्लेबुक चलाते हैं तो आप हर बार रैपर का उपयोग करते हैं। sourceदृष्टिकोण के साथ आप टर्मिनल सत्र के अनुसार एक बार वातावरण सेट करते हैं और सभी प्रकार के उपकरणों का अलग-अलग उपयोग कर सकते हैं: किसी भी रैपर के बिना ansible-playbooks, इन्वेंट्री स्क्रिप्ट, azure cli।
Konstantin Suvorov

आह, समझ गया। बीमार मेरी टीम को यह पिच। आपके उत्तर को अधिक सुविधाजनक समाधान के रूप में स्वीकार करना। अनुसंधान और स्पष्टीकरण के लिए धन्यवाद! साथ ही, मुझे आपका ब्लॉग :)
Vish

GPG (या macOS या लिनक्स पर एक चाबी का गुच्छा) का उपयोग करने का मुख्य लाभ यह है कि प्रत्येक टीम के सदस्य के पास स्वयं के लिए एक निजी कुंजी को अनलॉक करने के लिए अपना प्रमाणीकरण होता है। फिर इस कुंजी का उपयोग अन्सिबल वॉल्ट पासवर्ड को अनलॉक करने के लिए किया जाता है, जो एक साझा रहस्य है। आपको अपने सभी रहस्यों को घुमाना होगा यदि कोई व्यक्ति किसी भी तरह से टीम को छोड़ता है, जिसमें अन्सिबल वॉल्ट पासवर्ड शामिल है, लेकिन कम से कम जीपीजी / किचेन पासवर्ड को बदलना नहीं है।
रिचवेल

2

कृपया https://docs.ansible.com/ansible/2.4/vault.html को पढ़ें क्योंकि Ansible 2.4 कोई भी उपयोग कर सकता है --vault-id @prompt

फाइल को एनसिबल-वॉल्ट का उपयोग कर एन्क्रिप्ट करें:

ansible-vault encrypt /path/to/encrypted/file

प्लेबुक चलाएं और इसके परिणामस्वरूप होगा:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

फ़ाइलों को डिक्रिप्ट करने के लिए कई विकल्प हैं, जिनमें शामिल हैं @prompt:

ansible-playbook some-playbook --vault-id @prompt

शीघ्र होगा:

Vault password (default):

वॉल्ट पासवर्ड दर्ज हो जाने के बाद, प्लेबुक को सफल होना चाहिए।


1
पृष्ठ को पढ़ने से ऐसा लगता है कि वहाँ एक समाधान है, लेकिन केवल लिंक का उपयोग करके यह पता लगाने में असमर्थ है। क्या आप कृपया विस्तार से बता सकते हैं?
Vish

विस्तृत करने के लिए धन्यवाद। मैं वास्तव में एक तिजोरी पासवर्ड के लिए उपयोगकर्ता से पूछ रहा हूँ - पुराने --ask-vault-passविकल्प का उपयोग कर । और मैं यह समझने में विफल रहा कि इसे कैसे प्रतिस्थापित --vault-idकरना बेहतर वर्कफ़्लो के बड़े प्रश्न का उत्तर देगा।
Vish

जब आप मुझे लिंक करने के लिए भेजा रहा था एक पेचीदा विकल्प देखें: ansible-playbook --vault-id my-vault-password.py। मैंने सोचा कि शायद आपके पास एक अजगर स्क्रिप्ट का उपयोग करने के लिए एक समाधान था :) मैं भी इस एक के आसपास कुछ सोच रहा हूं।
विश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.