У сучасному світі контейнеризації Docker революціонізував спосіб розробки, тестування та розгортання додатків. Однак коли йдеться про управління та розповсюдження Docker-образів, публічні репозиторії, такі як Docker Hub, можуть не підходити для підприємств або організацій, які потребують приватності, безпеки та контролю над управлінням своїми образами. У такому випадку вирішенням часто стає приватний Docker-реєстр.
У цій статті ми проведемо вас через процес налаштування безпечного приватного Docker-реєстру за допомогою Sonatype Nexus та конфігурації з SSL, щоб забезпечити безпечну комунікацію для операцій з Docker-образами (push та pull).
Що таке Nexus Repository Manager?
Sonatype Nexus Repository Manager — це відкритий менеджер репозиторіїв, який підтримує різні типи артефактів, включаючи Docker-образи, Maven, npm та інші. Він дозволяє командам безпечно зберігати, керувати та розповсюджувати Docker-образи в межах їх інфраструктури. За допомогою Nexus можна створювати власні Docker-репозиторії та отримувати до них доступ через HTTP або HTTPS.
Налаштувавши Nexus як приватний Docker-реєстр, ви отримаєте:
- Контроль над Docker-образами: Можливість безпечно зберігати образи, які не доступні публічно.
- Швидший доступ: Зменшення залежності від зовнішніх репозиторіїв та прискорення процесу розгортання.
- Індивідуальні робочі процеси: Можливість керувати версіями, доступом та контролем Docker-образів.
Попередні вимоги
Для того, щоб слідувати цьому посібнику, вам буде потрібно:
- Linux-сервер або віртуальна машина (VM).
- Docker, встановлений на вашій машині.
- Nexus Repository Manager, встановлений та запущений.
- Доменне ім’я або IP-адреса для вашого Nexus-сервера.
- Базові знання роботи з командним рядком.
Крок 1: Встановлення Nexus Repository Manager
Для початку вам потрібно встановити Nexus Repository Manager. Ви можете запустити Nexus на фізичному сервері або використовувати Docker.
Варіант 1: Використання Docker
Запустити Nexus в Docker-контейнері — це найшвидший спосіб.
docker run -d -p 8081:8081 --name nexus sonatype/nexus3
Ця команда завантажить і запустить Nexus на порту 8081
(стандартний HTTP порт).
Варіант 2: Пряме встановлення
Якщо ви віддаєте перевагу встановленню Nexus безпосередньо, завантажте останню версію з вебсайту Nexus. Після завантаження слідуйте інструкціям щодо встановлення для вашої операційної системи.
Після встановлення Nexus буде доступний за адресою http://<IP>:8081
.
Крок 2: Доступ до веб-інтерфейсу Nexus
Якщо Nexus працює, ви можете отримати доступ до веб-інтерфейсу через ваш браузер. Перейдіть за адресою:
http://<IP>:8081
Використовуйте стандартні облікові дані:
- Логін:
admin
- Пароль:
admin123
Після першого входу обов’язково змініть пароль на більш безпечний.
Крок 3: Налаштування Nexus для Docker-реєстру
Тепер, коли Nexus працює, налаштуємо його для хостингу Docker-образів.
- Увійдіть в Nexus: Використовуйте облікові дані для входу.
- Створіть Docker-репозиторій:
- У панелі управління Nexus натисніть на вкладку “Repositories” зліва.
- Виберіть “Create repository”, потім виберіть “docker (hosted)”.
- Назвіть ваш репозиторій (наприклад,
my-docker-repo
). - Встановіть HTTP порт (за замовчуванням
5000
, але ви можете використовувати інший). - Включіть SSL, якщо ви хочете налаштувати безпечну комунікацію відразу, але ми розглянемо це на наступному кроці.
3.
**Зберегти репозиторій: Натисніть “Save” для створення вашого Docker-реєстру.
Крок 4: Увімкнення SSL на Nexus для безпечних операцій з Docker
Тепер, коли ми налаштували наш Docker-репозиторій, давайте забезпечимо його безпеку за допомогою SSL.
Налаштування Nexus для використання SSL:
- Скопіюйте згенерований файл
nexus.keystore
до директорії/opt/nexus/ssl/
(або до директорії, де встановлений Nexus). - Відредагуйте файл
nexus.properties
, який знаходиться за шляхом/opt/nexus/etc/
.
Додайте таку конфігурацію:
application-https-port=8443
ssl.keystore.path=/opt/nexus/ssl/nexus.keystore
ssl.keystore.password=
Перезапустіть Nexus:
Після збереження конфігурації перезапустіть Nexus, щоб застосувати налаштування SSL:
./bin/nexus restart
Тепер Nexus буде доступний безпечно через HTTPS за адресою https://<IP>:8443
.
Налаштування Docker для push та pull з Nexus через HTTPS
Довіряти SSL сертифікату:
Якщо ви використовуєте самопідписаний сертифікат, Docker має довіряти йому. Для цього потрібно додати сертифікат (nexus.crt
) до сховища сертифікатів Docker-клієнта:
sudo cp nexus.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
Увійти в Nexus Docker Registry:
Запустіть наступну команду для входу в Nexus через HTTPS:
docker login <IP>:8443
Введіть ваші облікові дані Nexus, коли буде запитано.
Push Docker-образів до Nexus:
Позначте ваш Docker-образ з адресою реєстру Nexus і завантажте його:
docker tag myapp:v1 <IP>:8443/myapp:v1
docker push <IP>:8443/myapp:v1
Pull Docker-образів з Nexus:
Щоб завантажити образ з Nexus, використовуйте:
docker pull <IP>:8443/myapp:v1
(Необов’язково) Зміна пароля через Nexus REST API
Якщо ви бажаєте, ви також можете змінити пароль за допомогою Nexus REST API. Ось як це можна зробити за допомогою простого API виклику:
Використовуйте наступну команду curl
для оновлення пароля користувача admin:
curl -u admin:<current-password> -X PATCH "http://<IP>:8081/service/rest/v1/security/users/admin" \
-H "Content-Type: application/json" \
-d '{"password": "<new-password>"}'
- Замініть
<current-password>
на поточний пароль (наприклад,admin123
). - Замініть
<IP>
на IP-адресу або доменне ім’я вашого Nexus-сервера. - Замініть
<new-password>
на новий пароль, який ви хочете встановити для користувача admin.
Після виконання цієї команди пароль буде оновлено, і ви зможете увійти з новим паролем.
(Необов’язково) Налаштування NGINX як зворотного проксі з термінацією SSL
Ви можете покращити безпеку та гнучкість вашої конфігурації, використовуючи зворотний проксі, такий як NGINX, для термінації SSL.
Встановлення NGINX:
sudo apt install nginx
Налаштування NGINX для SSL:
Створіть конфігурацію NGINX для переадресації запитів до Nexus.
Ось приклад конфігурації:
server {
listen 443 ssl;
server_name <your-domain>;
ssl_certificate /etc/nginx/ssl/nexus.crt;
ssl_certificate_key /etc/nginx/ssl/nexus.key;
location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name <your-domain>;
return 301 https://$host$request_uri;
}
Перезапуск NGINX:
Після налаштування NGINX, перезапустіть сервіс:
sudo systemctl restart nginx
Ось Docker команди після налаштування NGINX з SSL для вашого Nexus Repository:
docker login <your-ip>:443
docker tag <image-name>:<tag> <your-ip>:443/<repository>:<tag>
docker push <your-ip>:443/<repository>:<tag>
docker pull <your-ip>:443/<repository>:<tag>
Висновок
Виконуючи кроки, описані вище, ви успішно налаштували безпечний приватний Docker-реєстр за допомогою Sonatype Nexus та налаштували SSL для забезпечення безпечних операцій push і pull. Завдяки SSL, ваші Docker-образи передаються безпечно, що захищає чутливі дані та підвищує надійність і швидкість ваших деплойментів.
Незалежно від того, чи використовуєте ви самопідписаний сертифікат для внутрішнього використання, чи довірений SSL-сертифікат від CA, ця конфігурація забезпечить безпеку вашого Docker-реєстру від потенційних вразливостей, пов'язаних з незашифрованим зв'язком.
Забезпечивши ваш Docker-реєстр, ви не лише отримуєте підвищену безпеку, але й здобуваєте гнучкість і контроль над вашими Docker-образами, адаптуючи їх до конкретних потреб вашої організації.
Перекладено з: Setting Up a Secure Private Docker Registry with Nexus and SSL Configuration