Авторский канал от действующего девопса Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue Курс: @tormozilla_bot РКН: https://bit.ly/knd2gov
На GitVerse стала доступна среда разработки GigaIDE Cloud со встроенным AI-ассистентом
СберТех представил российскую облачную среду для разработки GigaIDE Cloud, встроенную в платформу для работы с исходным кодом GitVerse.
Среда обеспечивает редактирование, отладку, проверку и совместную работу с кодом, а также постоянный и безопасный доступ к предварительно настроенным рабочим пространствам разработки. GigaIDE Cloud доступна из браузера и позволяет вести разработку в удобном режиме с различных устройств вне зависимости от их производительности.
Также пользователи получили доступ к обновлённой версии интегрированной среды разработки GigaIDE Desktop, которую можно скачать на GitVerse. Десктопная версия стала стабильнее и производительнее, а еще добавились новые инструменты для анализа и навигации по элементам крупнейших фреймворков для Java.
В обе версии среды разработки интегрирован AI-ассистент разработчика GigaCode, который автоматизирует рутинные процессы и помогает программистам в реальном времени.
Начать пользоваться GigaIDE Cloud — по ссылке
Заголовок для привлечения внимания
ㅤ
А сегодня мы с тобой будем проверять на bash существует ли git репозиторий и есть ли к нему доступ.
В основе лежит команда git ls-remote, которая получает список ссылок (references) из удалённого репозитория.
Она показывает ветки, теги и другие указатели (refs), которые есть в репозитории, без необходимости клонирования или загрузки самого репозитория.
#!/bin/bash
# Проверяем, что указан репозиторий
if [ -z "$1" ]; then
echo "Ошибка: Необходимо указать адрес репозитория."
echo "Использование: $0 <адрес_репозитория>"
exit 1
fi
REPO_URL="$1"
# Выполняем команду git ls-remote для проверки доступа
if git -q ls-remote "$REPO_URL" &> /dev/null; then
echo "Репозиторий доступен: $REPO_URL"
else
echo "Ошибка: Репозиторий не существует или нет доступа: $REPO_URL"
exit 1
fi
GIT_TERMINAL_PROMPT=0
отключает любые запросы ввода имени пользователя и пароля. То есть если репа запросит логин/пароль, то вернется ошибка (без ожидания ввода)../git-check.sh https://github.com/bashdays/only.git
Репозиторий доступен: https://github.com/bashdays/only.git
./git-check.sh https://github.com/bashdays/zalupka.git
Ошибка: Репозиторий не существует или нет доступа: https://github.com/bashdays/zalupka.git
#!/bin/bash
# Проверяем, что указан репозиторий
if [ -z "$1" ]; then
echo "Ошибка: Необходимо указать адрес репозитория."
echo "Использование: $0 <адрес_репозитория>"
exit 1
fi
REPO_URL="$1"
# Функция проверки доступа
check_repo_access() {
local url="$1"
# Проверяем репозиторий с помощью git ls-remote
if git -q ls-remote "$url" &> /dev/null; then
echo "Репозиторий доступен: $url"
return 0
else
echo "Ошибка: Репозиторий не существует или нет доступа: $url"
return 1
fi
}
# Определяем, является ли URL SSH или HTTP/HTTPS
if [[ "$REPO_URL" == git@*:* ]]; then
# Если SSH, проверяем доступ через SSH
ssh_host=$(echo "$REPO_URL" | awk -F':' '{print $1}' | awk -F'@' '{print $2}')
if ssh -T "$ssh_host" &> /dev/null; then
check_repo_access "$REPO_URL"
else
echo "Ошибка: SSH-доступ к $ssh_host не настроен или нет прав."
exit 1
fi
else
# Для HTTP/HTTPS проверяем репозиторий
check_repo_access "$REPO_URL"
fi
По умолчанию папка для временных файлов расположена в корне /tmp.
В некоторых дистрибах эта папка монтируется в память. Но если оперативки мало, а чья-то софтина активно пишет в нее, есть смысл перенести папку /tmp
куда-нибудь на диск.
Ну а если папка /tmp
лежит на корневом разделе, а на разделе нет места, то это тоже проблема.
ㅤ
Самый распространенный и быстрый вариант:
1. Смонтировать новый диск в /mnt/tmp
2. Прокинуть симлинкой /mnt/tmp → /tmp
Но в некоторых случаях софт упоротый и скажет — я ебал писать в симлинку, давай мне нормальный локейшен в /tmp.
Упоротый софт в моем случае была некая многопоточная конвертилка pdf файлов, которая раздувала папку tmp до — я ебёшь! И пока она не сделает свои дела, за собой не уберет.
/mnt/tmp
sudo mkdir /mnt/tmp
sudo chmod 1777 /mnt/tmp
Права 1777 важны для временных директорий, чтобы все пользователи могли создавать файлы, но не удаляли чужие. Единичка это — стинкибит.
/etc/systemd/system/mnt-tmp.mount
[Unit]
Description=Mount tmpfs on /mnt/tmp
[Mount]
What=tmpfs
Where=/mnt/tmp
Type=tmpfs
Options=mode=1777,size=10G
[Install]
WantedBy=multi-user.target
Название файла не может быть любое, у нас есть путь /mnt/tmp в этом случае файл называем mnt-tmp.mount.
Если было бы /mnt/tmp/bashdays, то файл нам нужно обозвать mnt-tmp-bashdays.mount.
sudo systemctl daemon-reload
sudo systemctl enable mnt-tmp.mount
sudo systemctl start mnt-tmp.mount
/etc/environment
указываем переменную.TMPDIR=/mnt/tmp
source /etc/environment
echo $TMPDIR
df -h /mnt/tmp
sudo rm -rf /tmp/*
Как обычно люди используют screen:
screen
cd /usr/local/sbin
./db_import.sh
db_import.sh
продолжает где-то там шуршать и делать свои делишки.screen -list
3393.pts-3.dev (Attached)
screen -x 3393.pts-3.dev
или
screen -r 3393.pts-3.dev
(3393.pts-3.dev).
-r (resume) = подключаемся к сессии которая в данный момент отсоединена, то есть к ней не подключены другие юзеры.
-x (multi-user mode) = подключаемся к сессии к которой уже кто-то подключен, то есть несколько пользователей могут мешать друг другу в рамках одной сессии.
screen -dmS имя_сессии bash /путь/к/скрипту.sh
dmS это параметры для запуска screen в фоновом режиме (detached mode) с именем сессии.
d = запускает сессию в отключенном (detached) режиме.
m = создаёт новую сессию, даже если она существует.
S = имя сессии
screen -list
список будет пуст.screen -X -S "script0$scriptID" stuff "^C"
script0$scriptID = указывает на сессию с именем, здесь $scriptID это переменная, содержащая идентификатор или значение, которое будет подставлено в команду.
stuff = передаёт текст или последовательность символов в сессию screen, как если бы их ввел пользователь.
CTRL+A
и затем «d»
. Ты отключаешься от сессии, переходишь в интерактивный режим с терминалом, а скрипт продолжает шуршать в фоне.🔥 Скрытые данные в эмодзи/символах
Тут некий деятель Paul Butler, запиздярил штуку, которая позволяет при помощи последовательностей ZWJ (Zero Width Joiner) закодировать в один эмодзи неограниченный объём данных.
ㅤ
Да чо далеко ходить, идем сюды, выбираем эмодзи или букву алфавита, пишем текст который нужно спрятать и готово.
Копируем получившийся эмодзи/символ и отправляем по назначению. На этом же ресурсе можно расшифровать, то что получилось.
Unicode представляет текст как последовательность кодовых точек — чисел, которым присвоено определённое значение. Каждая кодовая точка записывается в формате U+XXXX, где XXXX — это шестнадцатеричное число в верхнем регистре.
Для латинских символов каждой кодовой точке соответствует конкретный символ на экране. Например, кодовая точка U+0067 обозначает букву "g".
Однако в некоторых системах письма один видимый символ может состоять из нескольких кодовых точек. Например, символ "की" в деванагари формируется из кодовых точек U+0915 и U+0940, соединённых вместе.
В комменты закину такой смайлик на потыкать. Перешли себе в Избранное и от туда уже правой мышкой - копировать текст.
Здрасти, сегодня продолжаем издеваться над ssh.
Давай прикрутим 2FA.
ㅤ
Идем на сервер к которому хотим подключmся по ssh и ставим пакеты:
sudo apt update
sudo apt install libpam-google-authenticator
google-authenticator
Do you want authentication tokens to be time-based (y/n)
google-authenticator -t -f -d -w 3 -e 5 -r 3 -R 60
google-authenticator --help
Your new secret key is: MAIY4KDCXKWHPDCI
Do you want me to update your "/root/.google_authenticator" file?
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks
и другие
/root/.google_authenticator
сохранится секретный ключ и коды восстановления. Этот файл не трогаем, без него тоже нихуя не заработает./etc/pam.d/sshd
# @include common-auth
auth required pam_google_authenticator.so
/etc/ssh/sshd_config
UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
PubkeyAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
sudo systemctl restart ssh
ssh root@bashdays.ru
(root@bashdays.ru) Verification code:
/root/.google_authenticator
они будут отлетать. Тут тоже аккуратнее./etc/ssh/sshd_config
Match User <имя юзера>
AuthenticationMethods publickey,keyboard-interactive
А как работать с 2FA и QR кодами из консоли, можешь почитать тут.
Сегодня будем запирать врата ада.
ㅤ
Ситуация: Есть физический сервер, на нём торчит само собой Linux, к нему подключен монитор и кнопки. Короче можно физически подойти к этой машине и ввести логин/пароль.
Ну или при желании понажимать ALT+F1, F2, F3
(чтобы переключать tty).
Надеюсь ты понял о чем я тебе говорю. Ну дак вот!
Задача: Нужно запретить физический вход по логину/паролю, но оставить вход по ssh с ключами.
Как настраивать все эти ключи можешь почитать в серии постов по тэгу: #linuxfactory
Давай теперь отключим физический доступ к tty.
Заходим на сервер и смотрим юниты
systemctl list-units | grep getty
getty@tty1.service
getty@tty2.service
getty@tty3.service
getty@tty4.service
getty (сокращение от get tty) — это программа в Linux и Unix-подобных системах, которая отвечает за управление терминалами и логин-процессом для пользователей, подключающихся к системе через консоль.
systemctl disable getty@tty{1..10}.service
systemctl stop getty@tty{1..10}.service
ALT+F1, F2, F3
— хуй там плавал!При отключении getty для терминалов tty1–tty10, это не повлияет на SSH-доступ, так как SSH-сервер работает независимо от getty.
sudo mount /dev/sdXn /mnt
sudo chroot /mnt
sudo systemctl enable getty@tty{1..10}.service
sudo systemctl start getty@tty{1..10}.service
Про Magic SysRq в Linux писал тут.
Чем терминал отличается от консоли писал тут
Вчера многие обратили внимание на конструкцию в nginx:
server_name _;
server {
listen 80;
server_name _;
return 444;
}
server {
listen 80;
server_name bashdays.ru;
return 200;
}
server {
listen 80;
server_name linuxfactory.ru;
return 200;
}
bashdays.ru
или linuxfactory.ru
, то получим статус 200.server_name
, то он будет обрабатываться этим серверным блоком.return 444
(No Response) используется для закрытия нежелательных запросов или для обработки некорректных запросов.default_server
в директиве listen
, и блок будет работать аналогично.server {
listen 80 default_server;
return 444;
}
Символ _ не имеет специального значения в самом Nginx. Это просто удобное соглашение, принятое сообществом.
Очередной распространенный вопрос - а схуяли нужно гитлаб изучать?
ㅤ
Почему не github / pornhub / gitea?
Ответ простой — Бесплатная версия GitLab (Community Edition) с открытым кодом даёт возможность изучить платформу без затрат. Для бизнеса это ещё и свобода от привязки к вендору.
Как пример, в школе я писал на Паскале, в голове сложил как работает программирование, ну и потом без труда пересел на сиськи потому что имел представление как работают программы. Синтаксис везде разный, но общая составляющая по базе одинаковая.
Грубо говоря — нарисовал в голове блок схему, напрограммировал. Благо сейчас полно книжек — Java для детей, Golang - для бабушек и т.п. Читаешь книжку за пару дней, знакомишься с синтаксисом и пошел кодить. Функции, циклы, условия они везде одинаковые.
Очередные грабли на которые в LF многие наступили.
ㅤ
Есть nginx с такой конфигурацией:
server {
listen 80;
server_name _;
location /app {
proxy_pass http://localhost:5000;
}
}
from flask import
Flask app = Flask(__name__)
@app.route('/')
def hello():
return 'Привет, Linux Factory!'
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
FROM python:3.8-slim
WORKDIR /app COPY .
/app RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]
docker build -t bashdays .
docker run -d -p 5000:5000 bashdays
http://bashdays.ru/app
и получаем хуй с маслом:Not Found. The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
location /app {
proxy_pass http://localhost:5000/;
}
app.py
получает роут /app
а его там естественно нет. А есть просто корень /
./app
к целевому урлу./app
проксируется на http://localhost:5000/app
, что не совпадает с маршрутом, настроенным в Flask./app
проксируется на http://localhost:5000
, и приложение Flask обслуживает его как корневой путь /
./app
и отправляет запрос на корень приложения Flask.Здрасти мои хорошие!
Рассмотрим ситуацию — злодеи устроили нагрузочное тестирование и натравили на твой ламповый стартап какой-нибудь «яндекс-танк».
ㅤ
😲 Подключить DDosGuard или Кратор!
Эт я пеню, ценник на такие услуги — моё почтение, да и по функционалу там очень даже всё урезано. А cloudflare по регламенту компании запрещен. Замкнутый круг.
Ну так что делать то?
Да блядь nginx затюнить и отбить всю эту хуйню-муйню. Понятно дело оно особо при дидосах не спасет, но со сканерами и «танками» заебись справится.
В nginx есть параметр limit_req_zone
, он то нам и пригодится. Этот параметр ограничивает количество одновременных запросов с одного айпишника.
Поехали настраивать.
Создаем файл /etc/nginx/conf.d/assholes.conf
geo $limited {
default 1;
192.168.1.1 0; # Этот IP не лимитируется
10.0.0.0/24 0; # 10.0.0.0/24 тоже без ограничений
}
map $limited $limit {
1 $binary_remote_addr;
0 "";
}
limit_req_zone $limit zone=bashdays:20m rate=200r/s;
limit_req_zone
- ключ для отслеживания запросов.$binary_remote_addr
- системная переменная nginx, внутри хранит ip адрес клиента.zone=bashdays:20m
- произвольное имя зоны, 20m это объём памяти в мегабайтах для хранения данных. В этой зоне хранятся данные о количестве запросов от каждого уникального клиента.rate=200r/s
- ограничение равное 200 запросов в секунды с одного ip клиента. Сценарий rate burst
-------------------------------------------
API с высокой нагрузкой 100r/s 200
Средний веб-сайт 50r/s 100
Анти-DDoS защита 10r/s 20
CDN или кеширующий прокси 500r/s 1000
ab -n 1000 -c 50 http://bashdays.ru/
wrk -t4 -c100 -d10s http://bashdays.ru/
Максимальное количество клиентов = размер зоны в байтах / размерзаписинаклиента
Пример расчёта для 20m (20 мегабайт = 20 × 1024 × 1024 = 20 971 520 байт):
20 971 520 / 128 = 163 840
20m
может хранить лимиты примерно для 163 тысяч уникальных клиентов одновременно.$binary_remote_addr
или другое значение) в зоне, используя примерно 128 байт на запись.< 20 000 = 4m
~80 000 = 10m
~160 000 = 20m
500 000+ = 64m
burst
для резких пиков. burst
позволяет временно превышать rate
, прежде чем включится жёсткий лимит.limit_req zone=bashdays burst=400 nodelay;
nodelay
означает, что первые 400 запросов проходят сразу, а потом начинается строгий лимит.$limited = 1
(по умолчанию).192.168.1.1
или из 10.0.0.0/24
, получат $limited = 0
и не будут ограничены.$limited = 1
, то $limit = $binary_remote_addr
(IP-адрес клиента).$limited = 0
, то $limit = ""
, и клиент не попадает в limit_req_zone.
location / {
limit_req zone=bashdays burst=10 nodelay;
try_files $uri $uri/ /index.php?$args;
}
Про burst и nodelay выше уже рассказывал.
location / {
limit_req_status 429;
limit_req zone=bashdays burst=10 nodelay;
try_files $uri $uri/ /index.php?$args;
}
А у нас тут это — ssh_commander
Эта штука позволяет запускать команды по ssh на нескольких серверах одновременно.
Что прикольно — можно выполнять команды из файлов. Нахуячил инструкций в файл, скормил этой тулзе, запустил. Вуаля!
Как проверить tar.gz без распаковки?
ㅤ
Да все просто, для начала создаем архив:
tar -czvf bashdays.tar.gz /etc
bashdays.tar.gz
. Теперь нужно проверить, что этот архив действительно годный и случайно не побился.tar -tzf bashdays.tar.gz
echo $?
ага выдаёт 0. Отлично!truncate -s -10 bashdays.tar.gz
tar -tzf bashdays.tar.gz
gzip: stdin: unexpected end of file
tar: Child returned status 1
tar: Error is not recoverable: exiting now
echo $?
ага выдаёт 2. Ага. Зная это ты можешь тестировать архивы без распаковки и затем заливать их например в s3.gzip -t bashdays.tar.gz
tar -xzf bashdays.tar.gz -O > /dev/null
#!/bin/bash
# Проверяем, передан ли аргумент
if [ $# -ne 1 ]; then
echo "Использование: $0 <файл архива>"
exit 1
fi
ARCHIVE="$1"
# Проверяем, существует ли файл
if [ ! -f "$ARCHIVE" ]; then
echo "Ошибка: файл '$ARCHIVE' не найден!"
exit 2
fi
# Определяем тип архива
if [[ "$ARCHIVE" == *.tar.gz || "$ARCHIVE" == *.tgz ]]; then
echo "Архив '$ARCHIVE' определён как tar.gz"
FORMAT="tar.gz"
elif [[ "$ARCHIVE" == *.tar ]]; then
echo "Архив '$ARCHIVE' определён как tar"
FORMAT="tar"
else
echo "Ошибка: неподдерживаемый формат архива!"
exit 3
fi
# Проверяем целостность архива
echo "Проверка содержимого архива..."
if ! tar -tzf "$ARCHIVE" &>/dev/null; then
echo "Ошибка: tar.gz архив повреждён!"
exit 4
fi
if [[ "$FORMAT" == "tar.gz" ]]; then
echo "Дополнительная проверка gzip..."
if ! gzip -t "$ARCHIVE" &>/dev/null; then
echo "Ошибка: gzip-архив повреждён!"
exit 5
fi
fi
echo "Архив '$ARCHIVE' проверен: ошибок не обнаружено."
exit 0
chmod +x check_tar.sh
./check_tar.sh bashdays.tar.gz
Хотите пиздатого девопса?
Отдаю вам в хантинг проверенного девопс-специалиста. Хантим на удалёнку, офис — мимо!
Если твой бюджет ниже 150к можешь даже не писать, а если ты деловой человек, то милости просим.
Макс, 35 лет, ищет работу, в меру упитанный мужчина, обладатель сокровенных знаний, закрыл ящик Пандоры, забрал душу у Шанг Тсунга, прыгал из самолета без парашюта, горел, делал сам себе искусственное дыхание. Опыт ёпта!
- Девопс ин де хаус
- Программист на yaml
- Широчайшие познания в aws
- Пайпы, ансиблы, докеры и вся байда
- Сети, роутинг, фаерволы
- Опыт работы в иностранных компаниях
- Часовой пояс? Наверное похуй!
- Linux, мониторинг, golang, java, bash…
Еще один частый вопрос с LF — а нужно ли менять дефолтный ssh (22) порт на какой-то другой?
ㅤ
Нет! Ну а нахуя? Сократить в логах количество записей про неудачные попытки подломить твой девственный сервак?
В логи ты ходишь — практически никогда! Тем более там logrotate работает и место диске сильно не забьется.
Предположим ты поменял 22 на 2222. Количество записей в логах «сократилось» и теперь ты ебешься с указанием порта.
ssh -p2222 user@server
~/.ssh/config
все это прописать и всё вернуть на свои места.Host bashdays.ru
HostName bashdays.ru
User user
IdentityFile ~/.ssh/shuba
Port 2222
nmap -Pn
, по итогу получат твой 2222 и продолжат долбиться.- отключи вход по паролю
- перейди на ssh ключи
- запрети вход для рута
Первые восемь раз надежда все еще не была потеряна
я без надежды убит тоской навылет прострелен потому что я надеялся а не был уверен...
🚀 Инженерная команда нового облака МТС Web Services продолжает рассказывать о разработке сервисов платформы.
В третьем выпуске проекта Building the Cloud поговорим про новый Object Storage.
🔑 Вы узнаете:
● какую архитектуру выбрали для нашего S3-совместимого хранилища данных;
● как обеспечиваем масштабируемость и надёжность хранения;
● как мы реализовали слои данных и метаданных;
● как работает асинхронная репликация данных между дата-центрами, и как используем erasure coding
💡 Для тех, кто пропустил первые выпуски: мы уже рассказали о создании сервисов Compute и IAM. Посмотреть можно здесь.
Регистрируйтесь и задайте свой вопрос техлиду команды Object Storage нового облака в прямом эфире. За лучший вопрос дарим мерч.
📅 Дата: 3 марта, 11:00
🌐 Регистрация
Как развернуть приложение в кластере Managed Kubernetes on Bare Metal
20 февраля в 16:00 Selectel проведет воркшоп, где покажет, как с помощью готового сервиса Managed Kubernetes сделать выделенные серверы частью экосистемы облачной платформы. Обсудим лучшие практики использования нового сервиса Selectel Managed Kubernetes on Bare Metal и его преимущества: изоляцию ресурсов, повышение производительности и сокращение расходов на IT-инфраструктуру до 40%.
Покажем процесс создания и работы с кластером Kubernetes на выделенных серверах. Отдельно рассмотрим интеграцию продукта с такими облачными сервисами как: Container Registry, Балансировщик нагрузки и Базами данных.
Воркшоп подойдет: DevOps- и SRE-инженерам, разработчикам, системным администраторам, архитекторам, руководителям IT-проектов и всем, кто работает с Kubernetes
Смотрите программу и регистрируйтесь на воркшоп по ссылке
Реклама. АО «Селектел», ИНН 7810962785, erid: 2VtzqvhCJ5a
Посвящаю тебя в Куборыцари! 🐈⚔️
Чтобы разработчику по-настоящему освоить Kubernetes, одних теоретических знаний мало. В идеале — найти наставника, который покажет реальные рабочие задачи и научит их решать. Тогда никакие переезды на кубы не страшны!
Пока вы в поисках такого человека, другие уже проходят «Kubernetes для разработчиков»: разрабатывают приложение под k8s и запускают его в кластере.
Как они этому учатся?
👉 80% времени — это практика, реальные задачи и работа со стендами.
👉 Постоянная поддержка — консультации экспертов на встречах и в общем чате.
👉 Финальный этап — сертификация, подтверждающая твои навыки.
Может, и вам пойти этим путём?
➡️ Старт — 3 марта.
➡️Забирайте место по ссылке
Реклама ООО «Слёрм» ИНН 3652901451
🔔 CI/CD: 90 минут практики от платформы до конвейера
20 февраля в 20:00 мы покажем весь путь CI/CD — от пустого проекта до работающей платформы. За 100 секунд — реальный запуск конвейера, а потом разберём каждый этап: пайплайны, тестирование, деплой, обработка ошибок и масштабирование.
Для кого открытый вебинар?
• DevOps-инженерам — разберётесь, как быстро настраивать CI/CD.
• Разработчикам — поймёте, как автоматизировать тестирование и деплой.
• Архитекторам — увидите, как строить отказоустойчивые CI/CD-процессы.
Спикер Кирилл Казаков — DevOps Lead в Simplinic.
⏺ Регистрируйтесь на урок прямо сейчас, чтобы не пропустить: https://vk.cc/cIHrTR
Посетителям урока отправим чек-лист по теме на e-mail.
Бонус: скидка на большое обучение «Инфраструктурная платформа на основе Kubernetes» для участников! Промокод Kuber_5 , действует до 28.02 для тех, кто пройдет вступительное тестирование на курс.Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Использовать ssh ключи очень удобно, при условии если у тебя в наличии 2-5-10 серверов
А как жить в ситуации когда у тебя 100500 серверов и еще 100500 пользователей?
ㅤ
Этож нужно за всем этим следить, обновлять и отзывать неактуальны (проёбанные) ключи. Всё скатывается в ужасную рутину.
Да, можно поднять какой-нибудь бастион и через него всем этим рулить, либо упороться с ансиблом и т.п.
Но чтобы не морочиться со всей этой хуйней, у тебя всё это есть и установлено из коробки. Вариант не совсем простой, легко запутаться, но если разобраться то качнешь свой скилл.
Центр сертификации (CA).
Работает он так:
1. Ты настраиваешь CA которому доверяют все твои 100500 серверов.
2. Сертификат подписывает ключи пользователей с указанием сроков действия и ограничений.
3. Если сотрудник покидает команду, ты просто отзываешь сертификат, а не удаляешь ключи с каждого сервера.
Давай замутим:
Берем какуюнить линукс машину и делаем из него CA.
ssh-keygen -t rsa -b 4096 -f ~/.ssh/ssh_ca -C "SSH Certificate Authority"
Описывать за что отвечают параметры не буду, всё это уже разжевали, читай посты по тегу #linuxfactory
ssh_ca
(приватный) и ssh_ca.pub
(публичный).ssh_ca.pub
) на все 100500 серверов.Тут уже сам автоматику организуй, либо баш скриптом, либо ансибл ролью либо еще как-то. Попробуй ради интереса изобрести своё решение.
scp ~/.ssh/ssh_ca.pub user@bashdays:/etc/ssh/
/etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/ssh_ca.pub
sudo systemctl restart ssh
authorized_keys
на удаленных серверах.ssh-keygen -s ~/.ssh/ssh_ca -I "user_cert" -n user -V +1w /tmp/user_key.pub
Signed user key /tmp/user_key-cert.pub: id "user_cert" serial 0 for username valid from 2025-02-16T12:02:00 to 2025-02-23T12:02:59
/tmp
появляется файл user_key-cert.pub
error: Certificate invalid: name is not a listed principal
ssh -i ~/.ssh/id_rsa -o CertificateFile=~/.ssh/user_key-cert.pub root@bashdays.com
2025-02-16 sshd[958704]: Accepted publickey for root from 11.11.11.11 port 35528 ssh2: RSA-CERT SHA256:Q4SKZ5cRycm79w0SyvRhAQR8 ID user_cert (serial 0) CA RSA SHA256:PtNBUw/+4/gGz4rc/ybu/uNHngcI
Если что-то не получается или не даёт зайти, пиздуешь на сервер к которому подключается и смотришь логи var/logs/auth.log. В этом файле тебе очень информативно подскажут что погуглить.
~/.ssh/authorized_keys
от тебе больше не пригодится. Потому что сервак начинает доверять всем ключам, которые подписаны через CA.touch /etc/ssh/revoked_certs
/etc/ssh/sshd_config
добавляем:RevokedKeys /etc/ssh/revoked_certs
ssh-keygen -k -f /etc/ssh/revoked_certs -z 1 user_key-cert.pub
Хочу стать DevOps-инженером. С чего начать?
➡️ С автоматизации, развертывания, масштабирования и управления приложениями в контейнерах, конечно же.
17 февраля Слёрм запускает новый поток курса «Kubernetes: База» для инженеров.
🔸Научим разворачивать инфраструктуру k8s, обслуживать кластер и его сервисы
🔸Подготовим к работе в DevOps-проектах
🔸Расскажем, как поддерживать k8s, находить неисправности и решать проблемы
🔸Покажем, как внедрить CI/CD, настраивать мониторинг и управлять контейнеризированными приложениями
Программа курса обновлена в июле 2024 года. Внутри:
👉 6 недель обучения
👉 73% практики и работы со стендами
👉 5 онлайн-встреч со спикерами
👉 итоговая сертификация
Узнать подробности и занять место на потоке — по ссылке ⬅️
Реклама ООО «Слёрм» ИНН 3652901451
Автопентест от Positive Technologies: запуск нового продукта
🔴 Хотите проводить пентесты, но нет возможности делать это постоянно?
🔴 Нужно быть уверенным, в том, что защита хорошо работает?
🔴 Необходимо выявлять бреши в безопасности, которыми злоумышленники могут воспользоваться в первую очередь?
Positive Technologies запускает новый продукт, который поможет решить эти задачи. PT Dephaze — это система, использующая тактики и техники реальных хакерских группировок для автоматической проверки возможности захвата критичных систем.
Продукт возьмет на себя всю рутину пентестов и освободит руки специалистов для более креативных задач.
Регистрация на онлайн-запуск уже открыта.
Мы расскажем о том, что вы действительно хотите знать. А еще пригласим в прямой эфир белого хакера, который будет комментировать все действия PT Dephaze и расскажет, как бы на его месте действовал пентестер.
Ждем вас 27 февраля в 14:00!
Хорошо смеётся тот, кто успел забронировать место на Deckhouse Conf 2025
Это день с продвинутым DevOps-комьюнити. С хардкорными докладами, кейсами по автоматизации инфраструктурных задач и безопасности. С полезным нетворкингом и общением с экспертами и коллегами.
27 марта в Москве.
Освойте Linux с Selectel
Вы начинающий DevOps-инженер, системный администратор или разработчик? Или только думаете над тем, чтобы начать освоение Linux?
Selectel запускает бесплатный курс «Администрирование Linux с нуля». Проходите в комфортном для себя темпе и проверяйте полученные знания на реальных задачах.
Чему вы научитесь:
– Управлять пакетами и обновлениями программного обеспечения
– Настраивать сети, SSH-соединения и мониторинг системы
– Управлять пользователями, файлами и правами доступа
– Работать с командной строкой Linux и основными утилитами
– Анализировать логи и устранять инциденты
Зарегистрируйтесь на курс «Администрирование Linux с нуля» по ссылке
Реклама. АО «Селектел», ИНН 7810962785, ERID: 2Vtzqwgy3ek
Связываем облачные и необлачные ресурсы ⚡️
Делимся вебинаром для тех просвещенных, кто хранит данные на отдельных виртуальных машинах или распределяет ресурсы между облаком и физическим сервером.
13 февраля облачный провайдер Cloud.ru расскажет, как организовать сетевую связность между виртуальными машинами разных VPC, а еще между облаком и on-premise инфраструктурой.
Что круто: это не лекция, а демо, где покажут, как работают разные сервисы сетевой связанности и объяснят, когда их применять. А после — ответят на ваши вопросы.
➡️ Зарегистрироваться можно здесь
❓ Хотите научиться запускать сайты на Linux с нуля?
На открытом уроке «Запускаем CMS Wordpress на Ubuntu 24.04» вы освоите настройку полного окружения для работы сайта.
💪 Что вы узнаете:
— Как установить и настроить веб-сервер Angie, PHP-FPM и MySQL.
— Как развернуть WordPress на чистой системе Ubuntu 24.04.
— Как создать полнофункциональный сайт с минимальными ресурсами.
⭐️ Спикер Николай Лавлинский — технический директор в Метод Лаб, PhD Economic Science, опытный руководитель разработки и преподаватель.
⏰ Встречаемся 12 февраля в 19:00 мск. Урок проходит в преддверии старта курса «Administrator Linux. Basic», а участники получат скидку на обучение.
👉 Сделайте первый шаг к профессии администратора Linux или запустите свой веб-проект: https://vk.cc/cIoj0b
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❔ Ваши релизы застревают на старте? Пора ускорить их до сверхзвука с Kubernetes!
CI/CD и GitOps — ваша формула успеха: автоматизация, стабильность, контроль. Все прямо в кластере!
Узнайте, как развернуть приложения без боли и сделать управление инфраструктурой лёгким, как настройка плейлиста в любимом стриминге.
Спикер Михаил Чугунов — ведущий DevOps-инженер.
⏺️Встречаемся 13 февраля в 20:00 мск. Участники получат скидку на большое обучение «Инфраструктурная платформа на основе Kubernetes».
👍 Регистрация открыта: https://vk.cc/cIfz0IРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Админы делятся на три категории:
ㅤ
1. Те, кто не делает архивы,
2. Те, кто уже делает архивы,
3. Те, делает и уже проверяет.
🔤🔤🔥🔤🔤🔤🔤
Сейчас многие архиваторы и компрессоры умеют делать архивы в несколько потоков. А, проверяют, почему-то в один.
У меня на СХД валится куча разных архивов и их приходится проверять, чтобы ускорить процесс можно использовать gnu parallel. Мне так не удобно, потому что архивы шифрованные, причем пароли у них разные, удобнее проверять скриптом.
Вот тут Роман набросал рыбу, для использования многопоточности. Я немного упростил. (до 7 необходимыx строк)
#/bin/bash
declare -x PATH="/usr/local/bin:/usr/bin:/bin"
declare -i JOB_NUM=$(nproc)
declare DELAY=0.5
exec >&2
for i in {1..50};do # это цикл по всем заданиям
# это команда, выполняемая в фоне
( sleep $(($SRANDOM % 3 +1)); echo ${SECONDS}_sec ) &
while [[ $(jobs -r -p |wc -l) -ge $JOB_NUM ]];do
sleep $DELAY
echo $i
done
done
echo end loop
wait
echo TOTAL $SECONDS sec
nproc
- число "ядер"DELAY
- задержка между проверками окончания выполнения фоновых заданий. Если задание выполняется долго (проверка архива) - можно смело ставить 10-30 секунд.exec >&2
перенаправили весь вывод на stderr. В реалном скрипте можно убрать. (Как и все echo).for
- основной цикл по списку всех заданий.sleep $(($SRANDOM % 3 +1))
- собственно фоновое задание. В данном случае пауза 1-3 сек.echo ${SECONDS}_sec
- ввел для примера, чтобы показать, что команд в фоновом задании может быть несколько.while
- как только запустили нужное число фоновых заданий, начинаем ждать окончания одного или нескольких.echo end loop
- как только основной цикл закончился - скрипт можно завершать (но некоторые задания еще могут долго работать).wait
- ожидать окончания всех фоновых заданий.echo TOTAL $SECONDS sec
- время полного выполнения скрипта.man nproc wc
help exec jobs wait
Еще немного про отладку ssh ключей, но уже в контексте интеграции со всякими гитлабами/гитхабами.
ㅤ
Чтобы работать с приватными репами ты добавляешь в настройки гитлаба/гитхаба свою публичную часть ключа.
Хорошо если такой ключ один, запутаться особо негде.
Но что если добавлено 20-100 ключей?
Порой возникает ситуация, когда какой-нибудь раннер отказывается клонировать репу и начинает орать на доступы.
ssh-keygen -l -E md5 -f ~/.ssh/id_rsa
2048 MD5:03:62:23:ca:ce:1b:8c:ad:60:1f:66:16:05:43:d8:a7 shuba@server (RSA)
А это значит что твой раннер использует не тот приватный ключ для подключения.