Есть старое правило: если можно сделать быстро и удобно, кто‑то обязательно сделает это в ущерб безопасности. В инфраструктурных командах это особенно заметно. Сетевики часто решают задачи «с лёту», и это прекрасно. Пока речь не заходит про пароли. Один из таких случаев стал для нас уроком На первый взгляд — мелочь, но последствия могли быть куда серьёзнее.

Как всё началось

Обычный рабочий день. Я проверял список процессов на сервере (ps aux) и вдруг вижу:

bash
sshpass -p 'Qwerty123' ssh admin@10.0.5.21

Пароль. В открытом виде. В командной строке.

Подошёл к коллеге:

— Это что за магия?

— Скрипт для быстрого доступа, чтобы пароль не вводить каждый раз.

— Ты в курсе, что этот пароль может увидеть любой пользователь на сервере?

— Ну мы же внутри сети

— До первого ps или попадания в логи.

Через пару часов у нас уже был внеплановый аудит.

Почему это проблема:

Передача пароля в аргументах — это классический антипаттерн.

  • Аргументы команд видны в ps, /proc/[PID]/cmdline, Task Manager.

  • Они могут попасть в логи CI/CD.

  • Мониторинг и аудит тоже их подхватят.

  • Многие утилиты (sshpass, plink, WinSCP CLI, rsync, mysql, curl, mRemoteNG) позволяют так передавать пароль — и это соблазн для быстрого «костыля».

В итоге получить пароль можно, даже не трогая сам SSH.

Как искать такие случаи

Windows (PowerShell)

powershell
$insecureProcs = Get-CimInstance Win32_Process | Where-Object {
    $_.CommandLine -match '\-p\s' -or $_.CommandLine -match '\-pw\s' -or $_.CommandLine -match '--password=' -or $_.CommandLine -match '/password='
} | Select-Object ProcessId, Name, CommandLine
$insecureProcs | Format-Table -AutoSize

Linux (bash)

bash
ps -eo pid,user,command --no-header | while read PID USER CMD; do
  if [[ "$CMD" =~ -p ]] || [[ "$CMD" =~ -pw ]] || [[ "$CMD" =~ --password= ]] || [[ "$CMD" =~ /password= ]]; then
    echo "PID=$PID USER=$USER CMD=$CMD"
  fi
done

Как мы «засветили» пароль в проде

Оказалось, что у нас крутился ночной бэкап через cron с командой:

bash
sshpass -p 'MySecret123' ssh backup@10.1.1.25

На сервере работали и другие пользователи. Пароль всплыл в мониторинге процессов. 

В довесок Jenkins сохранил эту же команду в логи пайплайна, доступные всем участникам проекта. Пришлось срочно менять ключи, чистить задачи и усиливать контроль.

Мини-справочник уязвимых инструментов

Инструмент 

Параметр пароля   

Где светится

sshpass  

-p 

ps, /proc

plink / pscp

-pw 

Task Manager

WinSCP CLI 

/password= 

cmdline 

rsync  

--password-file   

при доступном файле

curl / wget  

http://user:pass@

аргументы

mysql   

--password= 

предупреждение

smbclient

user%pass   

ps  

Jenkins  

sh "sshpass..."

логи 

Что внедрить в процесс

Linux — cron‑сканеры, Ansible, shell‑скрипты.

Windows — PowerShell + логирование.

CI/CD — линтеры и сканеры (Checkov, KICS, Semgrep).

IDE — pre‑commit хуки, запрещающие команды с паролем в аргументах.

Пример правила для Semgrep:

yaml
pattern: sshpass -p $PASS ...
message: 'Пароль передается в командной строке — это небезопасно.'
severity: ERROR

Как делать безопасно:

  • Использовать ssh-agent и ключи без паролей в скриптах.

  • Хранить секреты в Vault, AWS Secrets Manager, Ansible Vault. 

  • Прятать учётки в .pgpass, .my.cnf, .netrc (права 600). 

  • Разграничивать доступ: никто кроме root не должен видеть чужие процессы. 

  • Ограничивать или удалять опасные утилиты (sshpass и пр.). 

  • В случаях когда необходимо хранить секреты в файлах использовать кодировку

Вывод

Одна невинная оптимизация могла обернуться утечкой. Мы нашли и закрыли дыру, добавили регулярные проверки, а коллега перешёл на ключи.

Совет: проверьте свои сервера прямо сейчас. Если пароли в аргументах есть — убирайте немедленно. Такие мелочи могут стоить гораздо дороже, чем пять минут на настройку.

P. S. Был ли у вас подобный опыт? Расскажите, как находили и закрывали такие дыры. Возможно, получится собрать полезную подборку практик.

Комментарии (8)


  1. Melkij
    12.08.2025 09:26

    а лучше сразу раскатить PasswordAuthentication no


    1. Lazhu
      12.08.2025 09:26

      Заодно и PermitRootLogin no


      1. powerman
        12.08.2025 09:26

        Это не про усиление безопасности в контексте текущей статьи. Это скорее про аудит - при условии, что он настроен, что его логи кто-то смотрит, и что никто не использует `sudo bash` и аналоги (впрочем, помним про то, что выйти в шелл можно из многих других приложений, включая vim, так что это не панацея и желающие выполнить команды мимо аудита всё-равно смогут это сделать). В остальном большой пользы от этой настройки нет.


        1. DMGarikk
          12.08.2025 09:26

          большой пользы нет, но это усложнение атаки на сервис, одно дело когда злоумышленник попал на сервер сразу рутом и другое когда ему надо искать способ поднять привелегии, что при корректно настроенном ids с большей вероятностью алертнется

          ==

          и вообще под рутом в принципе нечего делать на любых машинах в корпоративной инфраструктуре, никому, даже самымглавнымадминам


          1. powerman
            12.08.2025 09:26

            это усложнение атаки на сервис, одно дело когда злоумышленник попал на сервер сразу рутом и другое когда ему надо искать способ поднять привелегии

            Это традиционный контр-аргумент. Проблема в том, что он больше теоретический, нежели практический - в теории чем больше уровней защиты тем лучше. А на практике первым возникает вопрос: а каким конкретно способом злоумышленник попал на сервер через ssh не под рутом? И дальше обычно выясняется, что в реалистичных сценариях у него в любом случае будет рут, если рут есть у владельца текущего аккаунта.

            и вообще под рутом в принципе нечего делать на любых машинах в корпоративной инфраструктуре, никому, даже самымглавнымадминам

            Ну так не кладите ключи в /root/.ssh/authorized_keys2 и их там не будет. А если серьёзно, то, опять же, в теории это возможно, но на практике даже при использовании IaaC изредка всё-равно нужен прямой доступ под root - когда случается что-то нештатное (железо частично поломалось, нужно отлаживать какие-то серьёзные странности в поведении ядра, нужно разобраться с идущей прямо сейчас атакой или провести расследование последствий атаки, etc.). И в таких случаях PermitRootLogin no просто мешается под ногами, без какой-либо пользы от него ни в этот момент ни в остальное время (потому что полноценного аудита при котором от него польза может быть на практике даже в средних компаниях почти не встречается).


  1. Cyber_Griffin
    12.08.2025 09:26

    Классика жанра:
    «Зачем хранить пароли в секретах, если можно просто sshpass -p "12345"
    Реальность: Через 5 минут этот пароль уже в логах, мониторинге и чате DevOps-ов.


  1. ValdikSS
    12.08.2025 09:26

    Использовать ssh-agent и ключи без паролей в скриптах.

    Это плохой совет, потому что стандартный ssh-agent просто предоставляет доступ к ключу, без всяких ограничений и подтверждений. Любое вредоносное ПО на сервере сможет пользоваться ключом подключённого администратора и подключаться к другим серверам.


    1. powerman
      12.08.2025 09:26

      Ну, это всё-таки лучше, чем светить паролем. Кроме того - а какие есть доступные альтернативы?