Как безопасно запустить Claude Code на сервере
Узнайте, как работает флаг --skip-permissions и как ограничить доступ Claude Code с помощью Docker или VPS, чтобы избежать выполнения опасных shell-команд.
Что означает безопасный запуск Claude Code на сервере
Для безопасного запуска Claude Code на сервере необходимо оставить включенными запросы на подтверждение действий, запускать программу от имени выделенного непривилегированного пользователя и обеспечивать автономным запускам реальные границы вместо доверия: встроенную песочницу, контейнер или одноразовый VPS, на котором нет важных для вас данных. Флаг --dangerously-skip-permissions убирает этап подтверждения между моделью и вашей оболочкой (shell). Такой компромисс допустим для автономной работы, но только внутри границ, которые ограничивают область действия одной ошибочной команды. В данном руководстве объясняется, что именно меняет этот флаг и как построить систему защиты, используя уровни возрастающей изоляции.
Что Claude Code может делать на вашем устройстве
Claude Code — это агент для написания кода, который работает в вашем терминале. Он читает файлы, записывает файлы и выполняет команды shell от имени пользователя, который его запустил. В этом заключается вся ценность инструмента: он может клонировать репозиторий, редактировать код, запускать тесты, анализировать ошибки и исправлять код в цикле, без необходимости вводить каждую команду вручную. Если вы еще не настроили его на сервере, руководство запуск Claude Code на VPS с использованием tmux содержит инструкции по установке и управлению сессиями. Эта страница описывает возможности, которые вы предоставляете агенту после настройки.
Риск заключается в том же, что и при повторном прочтении одного и того же предложения. Процесс, выполняющий команды shell от имени вашего пользователя, может делать всё то же самое, что и ваш пользователь. Он может читать ~/.ssh/id_ed25519, ~/.aws/credentials и любой .env файл, который может открыть ваш пользователь. Он может запускать curl и отправлять данные на любой хост, доступный серверу. Он может запускать git push --force. У агента нет собственных мотивов. Опасность возникает, когда задача выполняется неверно или когда текст, прочитанный в процессе работы, содержит инструкции, написанные кем-то другим: веб-страница, которую он загрузил, или комментарий в issue, которое ему поручили исправить. Второй случай называется prompt injection (инъекция промпта), и именно поэтому утверждение «модель обычно ведет себя разумно» не является планом обеспечения безопасности. Планируйте действия с учетом возможной ошибки, а не только среднего сценария.
Система разрешений простыми словами
По умолчанию Claude Code запрашивает подтверждение перед действием. Чтение файлов внутри проекта происходит незаметно, но редактирование файла или выполнение команды shell сначала показывает вам точную правку или команду и ждет подтверждения (yes). Вы можете одобрить одно действие или одобрить этот тип действий на всю сессию. Эти разрешения действуют в рамках сессии: если выйти из CLI, следующая сессия снова начнется с режима осторожности. Для правил, которые вы хотите сохранить, файл настроек хранит постоянные списки разрешенных (allow), запрашиваемых (ask) и запрещенных (deny) действий. Например: разрешить git status, запрашивать при git push, запретить чтение .env. Правила запрета (deny) всегда имеют приоритет.
Такой дизайн предполагает, что за терминалом наблюдает человек, и на ноутбуке это так и есть. На сервере же часто бывает так, что за терминалом никто не следит. Вы запускаете длительную задачу внутри tmux и ложитесь спать, а агент, который остановится с вопросом в 2 часа ночи, не продвинется в работе до утра. Пауза стоит не только времени, но и денег, так как сессия Claude Code в режиме ожидания теряет теплый кэш промптов, и следующий шаг потребует ресурсов на его восстановление. Это реальная причина, по которой люди используют флаг пропуска на серверах, и проблема, которую он решает, существенна. Остальная часть этого руководства посвящена тому, как решить эту проблему, не отказываясь от всех средств защиты.
Что меняет флаг --dangerously-skip-permissions
claude --dangerously-skip-permissions отключает этап подтверждения. Редактирование происходит без запроса. Команды shell выполняются без запроса. Проверки защищенных путей (protected-path), которые обычно охраняют конфиденциальные локации, также пропускаются. Ваши явные правила запрета (deny) по-прежнему действуют, и некоторые критические действия все равно потребуют подтверждения, но суть работы проста: всё, что решит запустить модель, будет запущено.
На сервере важны два факта о флаге. Во-первых, он заблокирован, если Claude Code запущен от имени root или через sudo в Linux и macOS, так как root без запросов может изменить любой файл или службу на машине. Агенту в любом случае требуется отдельная непривилегированная учетная запись, и флаг это обеспечивает. Во-вторых, флаг никак не меняет поведение модели. Он лишь убирает человека из цикла управления и больше ничего не меняет, поэтому любая ошибка, которую мог бы поймать запрос на подтверждение, теперь будет выполнена.
Вот честный расчет. Если вы пропускаете подтверждения, вопрос безопасности меняется с «совершит ли агент что-то плохое» на «какой ущерб может нанести одно плохое действие». Вы перестаете пытаться контролировать каждое решение и начинаете контролировать радиус поражения (blast radius). Решением является локализация, и она реализуется поэтапно.
Встроенная песочница Claude Code
Прежде чем переходить к этапам, знайте, что теперь Claude Code поставляется со встроенной песочницей на уровне ОС для выполняемых команд, что устраняет большинство причин использования флага пропуска. В Linux используется bubblewrap для изоляции файловой системы, а также socat для маршрутизации сетевого трафика через прокси. Внутри песочницы команда может записывать данные только в директорию проекта и временную директорию сессии, а доступ к сети возможен только через прокси, который проверяет каждый домен по списку разрешенных. Когда команде требуется новый домен, Claude Code запрашивает разрешение.
Включите песочницу командой /sandbox внутри сессии. В Ubuntu и Debian сначала установите два необходимых пакета:
sudo apt install bubblewrap socatВ Ubuntu 24.04 и более поздних версиях стандартная политика AppArmor мешает bubblewrap создавать необходимые пользовательские пространства имен (user namespaces). Панель песочницы сообщит вам, если чего-то не хватает; в документации Claude Code по песочнице есть короткий профиль AppArmor, который исправляет эту проблему.
У песочницы есть режим автоматического разрешения (auto-allow): команды в песочнице выполняются без запросов, так как установленная граница теперь выполняет работу, которую раньше выполнял запрос. Команды, которые не могут работать внутри песочницы, переходят к обычному циклу разрешений, поэтому действительно необычные действия все равно будут запрашиваться. Для большинства серверных рабочих процессов это правильная замена флагу пропуска, так как вы получаете гораздо меньше вопросов благодаря границе на уровне ОС вместо их полного отсутствия.
Будьте реалистичны в отношении её ограничений. По умолчанию команда в песочнице все еще может читать большую часть файловой системы, включая файлы учетных данных, если вы не запретите эти пути; настройка sandbox.credentials создана именно для этого. Сетевой прокси проверяет доменные имена, но не инспектирует сам трафик, поэтому широкий доступ, такой как github.com, все еще оставляет возможность для вывода данных. Docker внутри песочницы не работает. Песочница значительно повышает уровень безопасности, но это не полная изоляция, поэтому уровни ниже все еще важны.
Лестница локализации
Три уровня в порядке возрастания изоляции. Выберите самый низкий уровень, который подходит для условий вашего сервера.
Уровень 1: выделенный непривилегированный пользователь. Агент получает собственную учетную запись, свою домашнюю директорию, свою директорию проекта и не имеет прав sudo:
sudo adduser --disabled-password --gecos "" agentГраница учетной записи защищает ваши файлы: ваши SSH-ключи и любые другие проекты на машине. Это также делает использование флага пропуска возможным, так как флаг запрещает запуск от root. Это тот же принцип, что и запуск каждой службы от имени непривилегированного пользователя, примененный к агенту. Что уровень 1 не ограничивает: сеть и всё, что доступно для чтения всем пользователям на машине.
Уровень 2: контейнер. Anthropic выпускает эталонный devcontainer, который запускает Claude Code от имени не-root пользователя с правилами брандмауэра, ограничивающими доступ агента к хостам; созданный вами контейнер выполняет ту же задачу. Файловая система ограничивается смонтированными томами, а исходящий трафик — правилами контейнера. Это подходящий средний уровень, если на сервере размещены другие важные для вас службы. Его ограничение в том, что контейнеры используют ядро хоста, и один неосторожный mount (монтирование) разрушает границу; если передать контейнеру /var/run/docker.sock, он получит доступ ко всему хосту.
Уровень 3: выделенный VPS. Самый мощный уровень — самый радикальный: предоставьте агенту целую машину, на которой нет ничего важного для вас. Маленький VPS стоит всего несколько долларов в месяц. Настройте его с помощью инструкции по первым десяти минутам на новом VPS, сделайте snapshot (снимок) чистого состояния и позвольте агенту работать. Больше там ничего нет. Никаких личных SSH-ключей, только deploy key с доступом только к одному репозиторию. Никаких облачных учетных данных, никаких продуктовых данных. Если выполнение задачи пошло не так или если вам просто нужна чистая среда, восстановите snapshot или уничтожьте и пересоздайте машину за считанные минуты. Радиус поражения ограничен стоимостью аренды. Это такая конфигурация, где --dangerously-skip-permissions перестает быть пугающим, так как худшим реалистичным исходом будет пересозданный сервер и один отозванный токен.
Уровни накладываются друг на друга. Песочница, запущенная от имени непривилегированного пользователя на одноразовом VPS, стоит почти ничего дополнительно и делает истории о сбоях скучными. Скука — это цель.
Защита учетных данных
Правило, которое окупает всё остальное: пользователь агента не должен иметь возможности читать секреты, принадлежащие чему-либо другому.
Предоставьте API-ключ только агенту и больше никому. Поместите его в файл, принадлежащий пользователю агента, с правами 600, и загружайте его при запуске shell:
install -m 600 /dev/null /home/agent/claude.env
echo 'export ANTHROPIC_API_KEY=your-key-here' >> /home/agent/claude.env
echo 'source ~/claude.env' >> /home/agent/.bashrcЗатем ограничьте доступ в обратную сторону. В Debian и Ubuntu домашние директории часто создаются доступными для чтения любому пользователю на машине, поэтому ужесточите свою: chmod 750 /home/youruser. Проверьте с помощью ls -ld /home/* и исправьте всё, что может просмотреть учетная запись агента.
Ограничивайте область действия каждого токена. Токен GitHub с тонкими настройками (fine-grained), ограниченный одним репозиторием, или deploy key для одного репозитория означают, что при утечке учетных данных будет потерян только один проект, а не весь ваш аккаунт. Если вы используете песочницу, добавьте её настройки учетных данных, чтобы ~/.ssh и ~/.aws были запрещены даже для чтения. И полностью держите продуктовые учетные данные вне сервера, потому что агент не может украсть секрет, которого там никогда не было.
Git — это страховочная сетка
Любое изменение, внесенное агентом, должно быть доступно для проверки и отката; git предоставляет и то, и другое бесплатно, если агент работает в ветке:
git switch -c agent/refactor-authПроверьте результат работы после завершения с помощью git diff main...agent/refactor-auth, объедините (merge) удачные изменения и удалите ветку, если работа не принесла результата. Защитите основную ветку на стороне сервиса (forge), чтобы токен агента не мог делать в неё push и не мог выполнять force-push где-либо. История коммитов служит журналом аудита того, что происходило, пока вы спали, что ценнее любого лога терминала.
Сеть — часть радиуса поражения
Агент может выполнить curl. Это предложение описывает всю проблему исходящего трафика: всё, что агент может прочитать, он также может куда-то отправить, и агент, подвергшийся prompt injection, может это сделать. Обычный непривилегированный пользователь никак это не ограничивает, так как любой пользователь может достучаться до всего, к чему может достучаться сервер. Песочница ограничивает это по доменам через свой прокси. Контейнер может ограничить это своими правилами брандмауэра. Выделенный VPS ограничивает то, что вообще можно украсть, что является самым надежным решением из трех.
Не пытайтесь решить проблему исходящего трафика только с помощью ufw. ufw по умолчанию разрешает весь исходящий трафик, а написание правил, которые при этом разрешают apt, npm, git и Claude API, — это сложная работа, которая может незаметно сломаться. Вместо этого выбирайте границу на уровне песочницы, контейнера или машины, где список разрешенных доменов или чистая машина выполняют ту же задачу без лишних сложностей.
Если вы создаете собственного агента через API, а не запускаете Claude Code, те же принципы остаются неизменными. Создание ИИ-агента с помощью Claude на VPS описывает этот путь, и его агент заслуживает того же выделенного пользователя, тех же ограниченных токенов и той же одноразовой среды.
Сначала укрепите сервер
Какой бы уровень вы ни выбрали, самой машине всё равно необходимы базовые настройки перед тем, как агент начнет работу: только SSH-ключи, отсутствие входа под root, брандмауэр по принципу «запрещено всё, что не разрешено» (default-deny) и автоматические обновления безопасности. Создайте свой контрольный список здесь и выполните его один раз:
FAQ
Безопасно ли использовать --dangerously-skip-permissions на сервере?
Само по себе — нет. Этот флаг убирает все запросы на подтверждение, поэтому первая ошибочная команда будет выполнена в тот же момент, когда модель её сгенерирует. Это становится оправданным компромиссом только тогда, когда радиус поражения ограничен: как минимум, выделенный непривилегированный пользователь, а для полностью автономной работы — контейнер или одноразовый VPS, на котором находится только один проект и один ограниченный токен. Никогда не используйте это на машине, где хранятся продуктовые учетные данные или данные, которые вы не можете потерять.
Есть ли у Claude Code песочница?
Да. Claude Code поставляется со встроенной песочницей для команд shell, которая включается командой /sandbox. Она использует bubblewrap в Linux и Seatbelt в macOS, ограничивает запись только директорией проекта и направляет сетевой доступ через прокси, который разрешает только одобренные домены. Её режим автоматического разрешения выполняет команды в песочнице без запросов, что сокращает количество прерываний так же, как флаг пропуска, но при этом сохраняет границу на уровне ОС. Это не полная изоляция, поэтому используйте её в сочетании с выделенным пользователем или выделенной машиной для автономных запусков.
Почему флаг пропуска отказывается работать под root?
Потомутому что root без запросов на подтверждение может изменить любой файл и любую службу в системе, поэтому Claude Code блокирует --dangerously-skip-permissions, когда запускается от имени root или через sudo в Linux и macOS. Решение не в том, чтобы бороться с этой проверкой. Создайте непривилегированного пользователя для агента и запускайте его оттуда; граница учетной записи — это первый и самый дешевый уровень локализации.
Может ли Claude Code прочитать мои SSH-ключи и файлы .env?
Он может прочитать всё то же самое, что может прочитать пользователь, от имени которого он запущен; даже стандартная политика песочницы разрешает чтение путей с учетными данными, пока вы их не запретите. Поэтому запускайте агента от имени его собственного пользователя, держите свою домашнюю директорию в режиме 750 или строже, запрещайте пути к учетным данным в настройках песочницы и полностью держите продуктовые секреты вне машины. Секрет, которого никогда не было на машине, невозможно прочитать или украсть.
Какой способ запуска Claude Code без участия человека самый безопасный?
Дешевый выделенный VPS, используемый только для работы агента: настроенный за десять минут, с чистым snapshot, запуск Claude Code под непривилегированным пользователем с включенной песочницей, файл с API-ключом в режиме 600, deploy key для одного репозитория и вся работа в ветках, которые вы проверяете перед слиянием. Если запуск пойдет не так, вы просто отзываете один токен и восстанавливаете snapshot, и ни на что другое из вашего имущества это не повлияет.