Эта история адресована в основном тем, кто использует или интересуется использованием Nexus в качестве диспетчера пакетов для пакетов NPM, образов Docker и т. Д., Но также и тем, кому просто интересно читать о безопасности Nexus.

Некоторое время назад меня называли экспертом по NPM - просто потому, что мне посчастливилось получить билет, касающийся безопасности наших пакетов NPM. Изучив, как обеспечить безопасность, мне пришлось выяснить, как получить доступ к пакетам NPM из Nexus - и почему не всегда работает должным образом. После того, как мы поборолись с некоторыми проблемами, я подумал, что это руководство может помочь и другим разработчикам.

Почему я должен защищать свой Nexus Server?

Рассмотрим следующий сценарий: вы работаете в очень большой компании, состоящей из множества команд. Хотя вы можете подумать, что ваши коллеги из разных команд не должны навредить вашему проекту, вы все равно рискнете? Если у вас нет конфиденциальных данных, риска быть не должно. Но что, если у вас может быть промежуточное программное обеспечение, касающееся безопасности ваших API, и оно может испортить, например, некоторые уязвимости.

Еще одна причина для защиты заключается в том, что обычно у вас есть это для ваших собственных частных проектов - скорее всего, это не сработает для чужого проекта - им не следует и не пытаться использовать их, они не должны этого видеть.

И еще один момент (список, который, я думаю, можно продолжить), хотя вы можете защитить свои репозитории, и исходный код не является общедоступным для всей компании (частные репозитории github / bitbucket), имея внутренний URL-адрес, открытый для всех. URL-адрес сервера Nexus выглядит примерно так, и он доступен из внутренней сети. https: //nexus.intern.*subdomain*.*domain*.com

Как видите, мы можем просмотреть все пакеты npm на этом сервере с некоторой дополнительной информацией, мы можем их установить и т. Д. Хорошо, конечно, что вы не можете удалить актив, пока не войдете в систему. 👍 Но мы все равно должны избегать этого.

Еще одна вещь, которую вы можете сделать без входа в систему, - это настроить эту нексус 😱 (см. шестеренку рядом с панелью поиска).

Хорошо, а теперь, как его обезопасить?

Сначала, конечно же, нажмите на зубчатое колесо.

Затем, после нажатия на зубчатое колесо, откройте вкладку «Безопасность» и перейдите в раздел Анонимный. Затем снимите отметку annnnd - СОХРАНИТЬ.

Поздравляем, ваш Nexus защищен!

Что дальше?

Поскольку сейчас мы обеспечиваем безопасность Nexus, для установки и публикации пакета npm с вашего сервера Nexus потребуется вход в систему.

$ yarn install
yarn install v1.19.1
[1/4] Resolving packages...
[2/4] Fetching packages...
error An unexpected error occurred: "https://nexus.intern.***.***.***/repository/npm-group/auth/-/auth-1.0.0.tgz: Request failed \"401 Unauthorized\"".
info If you think this is a bug, please open a bug report with the information provided in "C:\\nexus\\test-nexus-security\\yarn-error.log".

Итак, первым делом нужно запустить npm login. Это поможет - частично. Но на самом деле еще одна очень важная часть - это файл .npmrc вашего проекта. Добавление always-auth = true обязательно.

Итак, ваш .npmrc должен выглядеть так:

registry=https://nexus.intern.***.***.***/repository/npm-group/
always-auth=true

Здорово ! Теперь мы защитили наш сервер Nexus и можем загружать пакеты npm !!

Еще один очень важный совет: иногда, даже если мы вошли в систему и все выглядит нормально, мы все равно можем получать ошибку 401 неавторизовано. код. Даже npm login вызовет ошибки, если мы попробуем еще раз. NPM кэширует ваш токен в папке $ HOME / .npmrc следующим образом.

//nexus.intern.***.***.***/repository/npm-group/:_authToken=NpmToken.753f5b43-47d3-3c0a-adde-f81e1e474444

Иногда нам нужно удалить файл .npmrc или его содержимое и повторно запустить npm login.

Теперь, как мне опубликовать пакет npm в Nexus?

Да, запуск npm publish может вызвать некоторые вопросы относительно вашей аутентификации. Это сработает. Но если вы используете для публикации сборки CI, это, конечно, не сработает. Итак, что нам нужно сделать, это добавить к .npmrc _auth = [строка base64 пары имя пользователя: пароль]

Итак, теперь ваш .npmrc должен выглядеть так:

registry=https://nexus.intern.***.***.***/repository/npm-group/
always-auth=true
_auth=Z2lnZWw6cGFzdGE=

Поскольку вы не должны фиксировать строку base64 в своем репозитории, это вопрос настройки ваших проектов CI / CD. Но это тема для отдельной истории .

Спасибо за чтение, и если это помогло, поделитесь, подписывайтесь и аплодируйте!