Thank you for reading this post, don't forget to subscribe!
Задача - периодическая смена пролей. Пароли хранятся в keepass.
Смена паролей осуществляется при помощи сервера Ansible
Bash-скрипт для смены паролей
/home/ansible/pwgen.sh
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/bin/bash echo "\"Account\",\"Login Name\",\"Password\",\"Web Site\",\"Comments\"" > /home/ansible/pwgen.csv for server in `cat /home/ansible/s_list.txt`; do echo $server IP=`echo $server | awk -F":" '{print $1}'` NAME=`echo $server | awk -F":" '{print $2}'` SEGMENT=`echo $server | awk -F":" '{print $3}'` VIRTIP=`echo $server | awk -F":" '{print $4}'` if [[ ${#VIRTIP} -gt 0 ]]; then VIRTIP=" (virt ip: $VIRTIP)" fi for USERNAME in root; do PASS=$(head /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 13 ; echo '') PASS_CRYPTO=`python -c "import crypt; print crypt.crypt(\"$PASS\")"` ansible-playbook -vv /etc/ansible/playbooks/pass_set.yml -u ansible --extra-vars "password=$PASS_CRYPTO sys_user=$USERNAME server=$IP" if [[ "$?" -eq 0 ]]; then echo "`date` --- Password for user $USERNAME changed on $IP - $NAME to $PASS" | tee -a /home/ansible/pwgen.log echo "\"console\",\"$USERNAME\",\"$PASS\",\"$NAME ($SEGMENT)\",\"$IP$VIRTIP\"" >> /home/ansible/pwgen.csv else echo "`date` --- ERROR: Password not changed on $IP - $NAME" | tee -a /home/ansible/pwgen_err.log fi done done chmod 600 /home/ansible/pwgen.csv chmod 600 /home/ansible/pwgen.log |
[/codesyntax]
На вход скипта передается текстовый файл /home/ansible/s_list.txt, либо /home/ansible/s_list_test.txt, содержащий ip-адрес, имя сервера, зону (DMZ,LAN и т.д.), вируальный ip(если имеется) в формате:
10.230.230.230:TC-VSRV-GIT1:BILLING(test):10.230.230.231
10.242.242.242:TC-VSRV-GIT2:LAN(test)
Внутри bash-скрипта вызывается ansible-плейбук /etc/ansible/playbooks/pass_set.yml, в который передаются необходимые реквезиты для смены паролей: ip-сервера, пароль, имя пользователя для которого мы меняем пароль.
cat /etc/ansible/playbooks/pass_set.yml
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
- hosts: '{{ server }}' become: true gather_facts: no become_method: sudo vars: rec_password: '{{ password }}' sys_user: '{{ sys_user }}' tasks: - name: debugging debug: var: rec_password - name: Change user password user: name={{ sys_user }} update_password=always password={{ rec_password }} |
[/codesyntax]
По итогу выполнения данного скрипта на выходе мы имеем файлы:
pwgen.csv - файл, текстового формата, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Содержит имя сервера, ip, измененный пароль. Пригоден для импортирования данных в БД KeePass.
pwgen.log - лог-файл успешного выполнения скрипта по смене паролей.
pwgen_err.log - лог-файл ошибок выполнения скрипта по смене паролей.
Примечание: Перед выполнением смены паролей необходимо убедиться, что хосты перечисленные в /home/ansible/s_list.txt, либо /home/ansible/s_list_test.txt имеются в списке /etc/ansible/hosts.
Если хост будет отсутствовать в списке /etc/ansible/hosts, смена пароля на указанном хосте не произойдет, но в pwgen.csv и pwgen.log будет значится успешная смена паролей.
======================================================================================================
Если лень править руками основной файл, то можно использовать ниже приведённый скрипт.
В keepass делаем экспорт группы в формате csv. Для экспорта выбираем:
Group
User Name
URL
Notes
Результат добавляем в файл Linux.csv и запускаем скрипт. На выходе получаем:
billing
dmz
lan
test_billing
test_lan
это мои группы разделения сети
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
#!/bin/bash p=`pwd` orig_csv='Linux.csv' cat $p/$orig_csv | grep Linux | grep -v -vE 'передан|предан|выведен|отключен|недоступен' | grep root | grep -iE 'LAN|BILLING|DMZ|test|tst' |sed 's|billing|BILLING|g' | sed 's|lan|LAN|g' | sed 's|dmz|DMZ|g' | sed 's|LAN|(LAN)|g' | sed 's|BILLING|(BILLING)|g' | sed 's|))))|)|g' | sed 's|((((|(|g' | sed 's|)))|)|g' | sed 's|(((|(|g' | sed 's|))|)|g' | sed 's|((|(|g' | sed 's|(BILLING)|","(BILLING)|g' | sed 's|(LAN)|","(LAN)|g' | sed 's|(DMZ)|","(DMZ)|g' | awk -F '","' '{print $3,$4,$5}' | sed 's|"||g' | sed 's|(| (|g' | sed 's|) *(|)(|g' | sed 's|DMZ *)|DMZ)|g' | sed 's|( *DMZ|(DMZ|g' | sed 's|test *)|test)|g' | sed 's| *test|test|g' | sed 's|virt ip|virtip|g' | sed 's|virt |virtip|g' |sed 's|:||g' | sed 's/ *$//' | sed 's/)$//' | sed 's/) */)/g' | sed -s 's|)1|) 1|g' > $p/new_$orig_csv mv $p/$orig_csv $p/old_$orig_csv firts_csv_for_end_rename="$orig_csv" orig_csv="new_$orig_csv" #получаем список всех виртуальных ip cat $p/$orig_csv | grep -iE 'virtip|virt ip' | sed 's|(virtip| virtip |g' | awk '{print $3":"$1":"$2":"$5}' |tr -d $'\r' > $p/virtip #Список всех billing тачек cat $p/$orig_csv | grep -i "billing" | grep -viE 'test|virtip' | awk '{print $3":"$1":"$2}' |tr -d $'\r' > $p/billing #Список всех billing тачек с виртуальными ip адресами добавляем в файл billing cat $p/virtip | grep -i billing | grep -vi test |tr -d $'\r' >> $p/billing echo "DONE BILLING $p/billing" echo "Before run rename $p/billing to $p/s_list.txt" ####################################################################################### #Получаем список всех lan тачек cat $p/$orig_csv | grep -i "lan" | grep -viE 'test|virtip' | awk '{print $3":"$1":"$2}' |tr -d $'\r' > $p/lan cat $p/virtip | grep -i lan | grep -vi test | tr -d $'\r' >> $p/lan echo "DONE LAN $p/lan" echo "Before run rename $p/lan to $p/s_list.txt" ####################################################################################### #Получаем список всех dmz тачек cat $p/$orig_csv | grep -i "dmz" | grep -viE 'test|virtip' | awk '{print $3":"$1":"$2}' |tr -d $'\r' > $p/dmz cat $p/virtip | grep -i dmz | grep -vi test |tr -d $'\r' >> $p/dmz echo "DONE dmz $p/dmz" echo "Before run rename $p/dmz to $p/s_list.txt" #Получаем список всех testBILL тачек cat $p/$orig_csv | grep -i "billing" | grep -i test | grep -vi virtip | awk '{print $3":"$1":"$2}' |tr -d $'\r' > $p/test_billing cat $p/virtip | grep -i test | grep -i billing |tr -d $'\r' >> $p/test_billing echo "DONE test_billing $p/test_billing" echo "Before run rename $p/test_billing to $p/s_list.txt" #Получаем список всех testLAN тачек cat $p/$orig_csv | grep -i "lan" | grep -i test | grep -vi virtip | awk '{print $3":"$1":"$2}' |tr -d $'\r' > $p/test_lan cat $p/virtip | grep -i test | grep -i lan |tr -d $'\r'>> $p/test_lan echo "DONE test_lan $p/test_lan" echo "Before run rename $p/test_lan to $p/s_list.txt" rm -rf $p/virtip $p/$orig_csv mv $p/old_$firts_csv_for_end_rename $p/$firts_csv_for_end_rename echo "Количество записей в оригинальном файле по BILLING без тестовых:" cat $p/$firts_csv_for_end_rename | grep -i billing | grep -vi test |wc -l echo "Количество записей в оригинальном файле по LAN без тестовых:" cat $p/$firts_csv_for_end_rename | grep -i lan | grep -vi test |wc -l echo "Количество записей в оригинальном файле по DMZ без тестовых:" cat $p/$firts_csv_for_end_rename | grep -i dmz | grep -vi test |wc -l echo "Количество записей в оригинальном файле по TEST:" cat $p/$firts_csv_for_end_rename | grep -i test |wc -l echo "=================================================================" echo "Количество записей в отредактированном файле billing" cat $p/billing | wc -l echo "Количество записей в отредактированном файле lan" cat $p/lan | wc -l echo "Количество записей в отредактированном файле dmz" cat $p/dmz | wc -l echo "Количество записей в отредактированных файлах test_billing test_lan" cat $p/test_billing > $p/test_all_bil_lan cat $p/test_lan >> $p/test_all_bil_lan cat $p/test_all_bil_lan | wc -l rm -rf $p/test_all_bil_lan |
[/codesyntax]
полученные файлы просматриваем и если всё ок и ничего не проебали то пихаем всё в файл
/home/ansible/s_list.txt
и запускаем скрипт на смену паролей.