Windows Subsystem for Linux удобен именно тем, что стирает границу между Windows и Linux: проекты, терминал, браузер, SSH-ключи и облачные токены часто оказываются в одном рабочем месте. Проблема в том, что WSL — не сейф для паролей. Это рабочая среда, и если не настроить привычки хранения секретов, пароли легко попадают в историю команд, конфиги, резервные копии и файлы, которые Windows-программы видят без лишних вопросов.
Главное правило: WSL можно безопасно использовать для разработки, если не хранить в нём постоянные пароли в открытом виде и не считать его изоляцией от Windows.
Если у злоумышленника уже есть доступ к вашей Windows-учётной записи с правами администратора, WSL его не остановит. Он может открыть файлы дистрибутива, экспортировать его, запустить команды от root или посмотреть то, что осталось в терминале. Поэтому безопасная схема строится не на надежде, что «в Linux всё защищено», а на простом правиле: секреты должны быть короткими, отдельными, зашифрованными или временными.
Поймите, где именно риск
У WSL есть свой Linux-пользователь и свой пароль. При первой установке дистрибутива система просит ввести имя пользователя и пароль — это не пароль Windows. Его не стоит делать таким же, как пароль от учётной записи Microsoft, корпоративного ноутбука или почтового ящика.
Этот пароль защищает вас от случайного sudo внутри Linux, но не от человека, который уже сидит в вашей Windows. Администратор Windows может запустить дистрибутив от root, сбросить пароль Linux-пользователя или получить доступ к файлам домашней директории. Поэтому пароль WSL должен быть уникальным, но не должен быть единственным ключом ко всем вашим сервисам.
Самые частые утечки выглядят банально: пароль попал в историю bash, сохранился в .env, оказался в Git, записался в ~/.docker/config.json, лежит в ~/.git-credentials или в проекте на /mnt/c, где Linux-права почти ничего не значат для Windows.
Где пароли обычно утекают в WSL
| Сценарий | Почему это опасно | Как сделать безопаснее |
|---|---|---|
| Один пароль для Windows и WSL | Если пароль WSL попадёт в историю или конфиг, под угрозой может оказаться и Windows-аккаунт. | Используйте разные пароли. Для WSL — отдельный уникальный пароль, лучше через менеджер паролей. |
Секреты в /mnt/c/Users/... |
Файлы на диске Windows видны Windows-программам, синхронизации и другим процессам. Linux-права там работают ограниченно. | Храните ~/.ssh, ~/.aws, ~/.npmrc и похожие файлы внутри Linux-дистрибутива, например в /home/user. |
Команды вида mysql -p'password', curl -u user:pass, docker login -p |
Пароль остаётся в истории терминала, scrollback, логах и иногда в процессах. | Вводите пароль интерактивно, используйте SSH-ключи, SSO, короткие токены или менеджер секретов. |
.env, .netrc, .git-credentials в проекте |
Такие файлы легко случайно закоммитить, отправить архивом или показать на скринкасте. | Добавьте их в .gitignore, храните отдельно, ставьте chmod 600, а лучше не храните постоянные секреты локально. |
docker login без credential helper |
Docker часто сохраняет учётные данные в ~/.docker/config.json. Это не шифрование, а кодировка. |
Используйте credential helper, токены с ограниченной областью действия или входите только на время работы. |
| SSH agent forwarding | Удалённый сервер может использовать ваш агент, если вы включили пересылку. | По умолчанию отключите ForwardAgent. Включайте только для доверенных серверов и только когда это действительно нужно. |
wsl --export или копия VHDX |
Экспорт дистрибутива содержит домашнюю директорию, конфиги и, возможно, секреты. | Не делитесь экспортом. Если делаете резервную копию — шифруйте её и удаляйте временный tar-файл. |
Настройте WSL так, чтобы не работать из-под root
Повседневная работа из-под root в WSL — плохая привычка. Она не только повышает шанс случайно сломать систему, но и мешает нормально разделять права. Лучше создать отдельного Linux-пользователя, сделать его пользователем по умолчанию и использовать sudo только там, где он нужен.
Пример настройки:
- Откройте PowerShell и зайдите в дистрибутив от root:
wsl -d Ubuntu -u root - Создайте обычного пользователя:
adduser dev usermod -aG sudo dev - Задайте ему пароль:
passwd dev - Сделайте его пользователем по умолчанию:
printf '[user]\ndefault=dev\n' > /etc/wsl.conf - Перезапустите WSL:
exit wsl --shutdown
После этого WSL будет открываться от имени dev, а не root. Пароль для этого пользователя должен быть отдельным: не от Windows, не от GitHub, не от облака и не от почты.
Не храните секреты на диске Windows
В WSL часто хочется положить всё в привычную папку Windows: /mnt/c/Users/Имя/Projects. Для исходников это иногда нормально, но для секретов — нет. На Windows-диске нет такой же модели прав, как в Linux. Файлы там могут читать программы, синхронизация, антивирус, backup-утилиты и другие процессы.
Для чувствительных файлов используйте Linux-дом:
~/.ssh/
~/.aws/
~/.azure/
~/.docker/
~/.npmrc
~/.netrc
~/.config/gcloud/
И сразу ограничьте права:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 700 ~/.aws
chmod 600 ~/.aws/credentials
chmod 600 ~/.npmrc
chmod 600 ~/.netrc
Это не спасает от администратора Windows, но защищает от случайной утечки между обычными Linux-процессами и от небрежного хранения рядом с проектами.
Уберите пароли из истории команд
История терминала — один из самых недооценённых источников утечек. Команда может выглядеть безобидно в момент ввода, а через месяц оказаться в бекапе, скриншоте или лог-файле.
Добавьте в ~/.bashrc или ~/.zshrc базовую настройку истории:
export HISTCONTROL=ignorespace:erasedups
export HISTSIZE=1000
export HISTFILESIZE=2000
shopt -s histappend
Если включён ignorespace, команда, начатая с пробела, не сохранится в истории. Например:
mysql -u admin -p
Но не обманывайтесь: scrollback терминала, скриншоты и логи всё равно могут сохранить введённый пароль. Поэтому пробел в начале команды — это аварийная привычка, а не нормальный способ работы.
Лучше так:
- для баз данных — подключаться через SSH-туннель и вводить пароль интерактивно;
- для Git — использовать SSH-ключ с passphrase или SSO;
- для облаков — использовать SSO, короткие токены или credential process;
- для Docker — не писать пароль прямо в команде
docker login -p.
Если пароль всё-таки попал в историю, очистите её:
history -c
history -w
И проверьте открытые вкладки терминала: в scrollback пароль может остаться, даже если история уже очищена.
Используйте SSH-ключи вместо паролей
Для Git, серверов и CI удобнее использовать SSH-ключ, чем постоянно вводить пароль. Но ключ — это тоже секрет. Разница в том, что его проще защитить passphrase, отключить на время и не показывать в командах.
Минимально безопасная схема:
ssh-keygen -t ed25519 -C "work-laptop"
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
В ~/.ssh/config отключите пересылку агента по умолчанию:
Host *
ForwardAgent no
IdentityAgent ~/.ssh/agent.sock
Добавляйте ключ в агент только на время работы:
ssh-add -t 4h ~/.ssh/id_ed25519
А когда закончили — выгрузите:
ssh-add -D
Не включайте agent forwarding на серверах, которым не доверяете. Если сервер скомпрометирован, он может попытаться использовать ваш агент для подключения дальше.
Не поднимайте SSH-сервер в WSL без необходимости
Иногда в WSL включают sshd, чтобы подключаться к нему по сети. Для обычной разработки это редко нужно. В Windows уже есть нормальный доступ к WSL через терминал, VS Code Remote — WSL и обычные инструменты Microsoft.
Если SSH-сервер всё-таки нужен, сделайте минимум:
- не используйте парольную аутентификацию;
- включите вход только по SSH-ключам;
- не открывайте порт 22 наружу;
- не подключайтесь к WSL по SSH из чужой сети без VPN;
- используйте отдельного пользователя, не root.
Если сервис должен быть доступен только вам, запускайте его на 127.0.0.1, а не на 0.0.0.0. Для временной разработки это снижает шанс, что база, админка или dev-сервер станут доступны кому-то ещё в сети.
Осторожнее с Docker и токенами реестров
Docker в WSL часто используют вместе с Docker Desktop. Это удобно, но небезопасно по привычке. Команда docker login -p "пароль" оставляет пароль в истории. Обычный docker login может сохранить данные в ~/.docker/config.json.
Более безопасный подход:
- не писать пароль в команде;
- использовать токен реестра с ограниченной областью действия;
- использовать credential helper, если он есть;
- выходить из Docker после работы, если компьютер общий;
- не монтировать в контейнеры папки с секретами без необходимости.
Отдельный момент — группа docker. Пользователь в этой группе фактически получает очень широкие права: через Docker можно смонтировать файловую систему хоста и прочитать файлы, к которым обычно доступа нет. Не добавляйте пользователя в


