Тестирование активных ключей SSH в локальной сети - PullRequest
0 голосов
/ 01 ноября 2018

В настоящее время я пытаюсь создать сценарий bash, который будет проверять, связаны ли ключи SSH на сервере с известными узлами, которые активны в локальной сети. Вы можете найти ниже начало моего скрипта bash, чтобы добиться этого:

#!/bin/bash

# LAN SSH KEYS DISCOVERY SCRIPT
# TRYING TO FIND THOSE SSH KEYS NOW

cat /etc/passwd | grep /bin/bash > bash_users
cat bash_users | cut -d ":" -f 6 > cutted.bash_users_home_dir
for bash_users in $(cat cutted.bash_users_home_dir)
do
ls -al $bash_users/.ssh/*id_* >> ssh-keys.txt
done

# DISCOVERING THE KNOWN_HOSTS NOW

for known_hosts in $(cat cutted.bash_users_home_dir)
do
cat $bash_users/.ssh/known_hosts | awk '{print $1}' | sort -u >> 
hosts_known.txt
sleep 2
done
hosts_known=$(wc -l hosts_known.txt)
echo "We have $hosts_known known hosts that could be still active via SSH 
keys"

# TIME TO TEST WHICH SSH servers are still active with the SSH keys
# AND THIS IS WHERE I AM FROZEN...
# Would love to have bash script that could
# ssh -l $users_that_have_/bin/bash -i $ssh_keys $ssh_servers
# Would also be very nice if it could save active
# SSH servers with the valid keys in output.txt in the format
# username:local-IP:/path/to/SSH_key

Пожалуйста, не стесняйтесь редактировать / изменять скрипт bash выше, если он может лучше служить описанным целям.

Любая помощь будет очень ценится,

Спасибо

1 Ответ

0 голосов
/ 01 ноября 2018

круто работает следующее:

</etc/passwd \
grep /bin/bash | 
cut -d: -f6 | 
sudo xargs -i -- sh -c '
     [ -e "$1" ] && cat "$1"
' -- {}/.ssh/known_hosts | 
cut -d' ' -f1 | 
tr ',' '\n' | 
sed '
     /^\[/{ 
          s/\[\(.*\)\]:\(.*\)/\1 \2/; 
          t; 
     }; 
     s/$/ 22/;
' | 
sort -u |
xargs -l1 -- sh -c '
    if echo "~" | nc -q1 -w3 "$1" "$2" | grep -q "^SSH"; then 
          echo "#### SUCCESS $1 $2"; 
    else 
          echo "#### ERROR $1 $2"; 
    fi
' --

Итак:

  1. Начните с /etc/passwd
  2. Отфильтруйте всех "bash_users", как вы их называете
  3. Фильтровать только домашние каталоги пользователей cut -d: -f6
  4. Для каждого домашнего каталога пользователя sudo xargs -i -- запустить
    1. Проверьте, существует ли файл .ssh / known_hosts внутри домашнего каталога пользователя
    2. Если это так, распечатайте его
  5. Фильтровать только имена хостов
  6. Несколько подписей хостов могут использовать один и тот же ключ и разделяться запятой. Заменить запятую на новую строку
  7. Теперь скрипт sed:
    1. Если строка начинается с [, это означает, что она имеет формат [host]:port, и я хочу заменить ее на host port
    2. Если строка не начинается с [, я добавляю 22 в конец строки, так что это host 22
  8. Тогда я sort -u
  9. Теперь для каждой строки:

    1. Я получаю ssh-версию от ssh echo "~" | nc hostname port возвращает что-то вроде «SSH-2.0-OpenSSH_6.0» + newline + «Несоответствие протокола».
    2. Таким образом, если строка, возвращаемая nc hostname port, начинается с SSH, это означает, что ssh работает на другой стороне
    3. Я добавил тайм-аут для не отвечающих хостов, но я думаю, что опция nc -w timeout также может быть использована. Вероятно, также следует указать nc -q 1.
  10. Теперь самое интересное, когда вы добавляете параметр max-procs в последнюю строку xargs, вы можете проверять все хосты одновременно. На моем хосте у меня есть 47 уникальные адреса и xargs -P30 проверяет их ВСЕ в течение 2 секунд.

  11. Но на самом деле есть некоторые проблемы. Скрипту нужен root для чтения от всех пользователей known_hosts. Но что еще хуже, известные_хосты могут быть хешированы. Было бы лучше сначала узнать список хостов в вашей сети, а затем сгенерировать из него known_hosts. Это будет выглядеть как ssh-keyscan -f list_of_hosts > ~/.ssh/known_hosts или подобное. В общем случае ssh-keygen -F hostname следует использовать, если хост присутствует в known_hosts, к сожалению, команды листинга нет. Формат файла known_hosts можно найти в документации ssh .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...