Как быстро скачать файл с сервера
ㅤ
Бывает ситуация, когда тебе нужно быстренько дернуть какой-то файл с сервера, но там нет ни nginx ни т.п. херни. Вспоминать синтаксис scp и ебаться с ключами тоже не хочется. Тем более для такой задачи ставить софт — ну такое себе.
Из ситуации можно выйти проще.
Заходим в любую папку с файлами и запускаем:
Если питон старый, потрёпанный и сморщенный как хуй, делаем так:
Затем курлим файл и скачиваем его к себе на машину:
А можем прям в браузере открыть URL и увидеть список всех файлов, кликаем мышкой и скачиваем необходимое.
Еще бывают случаи когда
Ну и в конце, когда получил желаемое, не забывай остановить такой веб-сервер. Изучай!
🛠 #security #linux #tricks
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Бывает ситуация, когда тебе нужно быстренько дернуть какой-то файл с сервера, но там нет ни nginx ни т.п. херни. Вспоминать синтаксис scp и ебаться с ключами тоже не хочется. Тем более для такой задачи ставить софт — ну такое себе.
Из ситуации можно выйти проще.
Этот способ в основном используют спец-люди, которые в результате blackbox вектора проникли на север и им нужно утащить жирненькую базу данных. Всё элементарно.
Заходим в любую папку с файлами и запускаем:
python -m http.server 2977
Если питон старый, потрёпанный и сморщенный как хуй, делаем так:
python -m SimpleHTTPServer 2977
Затем курлим файл и скачиваем его к себе на машину:
curl -O http://linuxfactory.ru:2977/bashdays_db.zip
А можем прям в браузере открыть URL и увидеть список всех файлов, кликаем мышкой и скачиваем необходимое.
Еще бывают случаи когда
curl не установлен, но wget есть из коробки:wget -O bashdays_db.zip http://linuxfactory.ru:2977/bashdays_db.zip
Ну и в конце, когда получил желаемое, не забывай остановить такой веб-сервер. Изучай!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
4 82
Получаем SSL сертификат на IP адрес.
ㅤ
Вот и случилось, теперь ты можешь сгенерить валидный SSL сертификат для айпишника. Не самоподписанный, а прям настоящий от Lets Encrypt.
Единственный момент, такой серт будет валиден несколько дней (160 часов), поэтому придется почаще его выпускать, сейчас ставят 5 дней для обновления, как золотую середину. НЕ рекомендуется ставить 6, иначе можешь словить граблю. Вообще acme сам всё в кроне должен прописать, но это не точно.
Пока это может делать только acme, все остальные (certbot, angie) совсем скоро к этому придут.
Да, для домаших айпишников увы, такая чача не проканает, при попытке получить такой серт, получаем ошибку:
Ну оно и логично, спецификации никто не отменял.
Я буду генерить для
Приступим:
Не забудь подставить своё мыло, а то меня спамом завалит и я буду материться на кота.
Конфигурируем
Создаем структуру папок и релоадим:
Выписываемпиздюлей сертификат:
Отлично, сертификат получили, устанавливаем:
Добавляем дополнительный блок в
Перезапускаем:
И радуемся, теперь у тебя есть валидный SSL на голом айпишнике:
Дело в шляпе, что сказать? Пиздато! Порой ОЧЕНЬ не хочется привязывать домен, чтобы обзавестись SSL сертификатом, теперь выход есть. Глядишь найдется хак, чтобы сгенерить подобное для 192.168.0.1, но наверное это из оперы моих влажных фантазий.
🛠 #linux #devops #ssl
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Вот и случилось, теперь ты можешь сгенерить валидный SSL сертификат для айпишника. Не самоподписанный, а прям настоящий от Lets Encrypt.
Не путать с mkcert, это совсем другое.
Единственный момент, такой серт будет валиден несколько дней (160 часов), поэтому придется почаще его выпускать, сейчас ставят 5 дней для обновления, как золотую середину. НЕ рекомендуется ставить 6, иначе можешь словить граблю. Вообще acme сам всё в кроне должен прописать, но это не точно.
Пока это может делать только acme, все остальные (certbot, angie) совсем скоро к этому придут.
Да, для домаших айпишников увы, такая чача не проканает, при попытке получить такой серт, получаем ошибку:
Cannot issue for \"192.168.10.91\": IP address is in a reserved address block: [RFC1918]: Private-Use"
Ну оно и логично, спецификации никто не отменял.
Я буду генерить для
178.72.129.181 на котором у меня установлен nginx. Виртуалка прерываемая, так что денег практически не жрет, для тестов в настоящем облаке — милое дело.Приступим:
Не забудь подставить своё мыло, а то меня спамом завалит и я буду материться на кота.
curl https://get.acme.sh | sh -s email=shubkin@bashdayz.ru
Конфигурируем
default в nginx:server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location ~ ^/.well-known/(acme-challenge|pki-validation)/ {
add_header Content-Type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}Создаем структуру папок и релоадим:
mkdir -p /var/www/letsencrypt
mkdir -p /etc/nginx/ssl
nginx -t
nginx -s reload
Выписываем
acme.sh --issue --server letsencrypt -d 178.72.129.181 -w /var/www/letsencrypt --certificate-profile shortlived --days 3
Отлично, сертификат получили, устанавливаем:
acme.sh --install-cert -d 178.72.129.181 --key-file /etc/nginx/ssl/ip.key --fullchain-file /etc/nginx/ssl/ip.crt --ca-file /etc/nginx/ssl/ip.ca.crt --reloadcmd "systemctl restart nginx"
Добавляем дополнительный блок в
default в nginx:server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
return 403;
ssl_certificate /etc/nginx/ssl/ip.crt;
ssl_certificate_key /etc/nginx/ssl/ip.key;
}Перезапускаем:
nginx -t
nginx -s reload
И радуемся, теперь у тебя есть валидный SSL на голом айпишнике:
Общее имя (ЦС) YE1
Организация Let's Encrypt
Дата выдачи: 29 января 2026 г.
Срок действия: 5 февраля 2026 г.
Дело в шляпе, что сказать? Пиздато! Порой ОЧЕНЬ не хочется привязывать домен, чтобы обзавестись SSL сертификатом, теперь выход есть. Глядишь найдется хак, чтобы сгенерить подобное для 192.168.0.1, но наверное это из оперы моих влажных фантазий.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
12 46
Поднимаем свой поисковик или Fuck The Google!
Продолжаем тему приватности. Кто не в курсе, пару недель назад я отказался от гугла и его сервисов, по некоторым причинам, ну и чтобы бороться с зависимостью я активно переезжаю на проверенные opensource решения.
ㅤ
На этот раз я залез в кроличью нору, отказавшись от поисковиков. Ну как отказавшись, я поднял свой поисковик, который конфиденциально делает запросы в 100500 выбранных тобой поисковиков и агрегирует результаты.
Всё это дело в два клика поднимается как self-hosted, отлично работает с проксями и луковичной маршрутизацией. Как говорится — полный фарш.
Проект называется: SearXNG.
По началу я отнесся к этому решению скептически, но потыкав более вдумчиво мне зашло, зачетная аще штука. Работает быстро, уверенно, выдает релевантную информацию и выглядит очень достойно. Кто бы мог подумать, 25к звезд на гитхабе.
Ну и дополнительно, ребята из нижнего мира активно пользуются этой штуковиной.
Композ файл выглядит так:
Конфиг
Обращаем внимание на
Запускаем по классике. Заходим в браузере
Для рядового пользователя это скорее игрушка, но у кого повышенная тревожность вполне зайдёт, тем более с поставленными задачами SearXNG отлично справляется.
Из минусов, не все поисковики лояльны, кто-то может запрашивать капчу, но на это есть официальное решение. Я его не пробовал, мне пока достаточно тех что у меня подключены сейчас.
И да если думаешь что DuckDuckGo панацея — неа, это компания в мудацкой стране под названием США, которая по первому запросу, сольет про тебя всё что на тебя есть, без зазрения совести. Потому что любая компания в США (CLOUD Act) по запросу суда, должна предоставить такие данные.
Не ведись на такое, это ПИЗДЁШЬ! Всё у них есть, не так много как у гугла, но есть, чтобы тебе смогли подвести писю к носу.
Век живи, век учись!
🛠 #security #privacy
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Продолжаем тему приватности. Кто не в курсе, пару недель назад я отказался от гугла и его сервисов, по некоторым причинам, ну и чтобы бороться с зависимостью я активно переезжаю на проверенные opensource решения.
ㅤ
На этот раз я залез в кроличью нору, отказавшись от поисковиков. Ну как отказавшись, я поднял свой поисковик, который конфиденциально делает запросы в 100500 выбранных тобой поисковиков и агрегирует результаты.
Всё это дело в два клика поднимается как self-hosted, отлично работает с проксями и луковичной маршрутизацией. Как говорится — полный фарш.
Проект называется: SearXNG.
По началу я отнесся к этому решению скептически, но потыкав более вдумчиво мне зашло, зачетная аще штука. Работает быстро, уверенно, выдает релевантную информацию и выглядит очень достойно. Кто бы мог подумать, 25к звезд на гитхабе.
Ну и дополнительно, ребята из нижнего мира активно пользуются этой штуковиной.
Хотя сейчас большинство давно уже переехали в ИИ и задают поисковые вопросы именно там, но все же иногда рука тянется поискать самостоятельно. Сливать в ИИ теже запросы, тоже такое себе, хотя всем плевать.
Композ файл выглядит так:
services:
searxng:
image: searxng/searxng:latest
container_name: searxng
restart: unless-stopped
networks:
- searxng_net
ports:
- "8080:8080"
volumes:
- ./searxng:/etc/searxng
environment:
- SEARXNG_SECRET_KEY=1234567890
read_only: true
tmpfs:
- /tmp
- /etc/ssl/certs
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
security_opt:
- no-new-privileges:true
networks:
searxng_net:
driver: bridge
Конфиг
./searchxng/settings.yml:use_default_settings: true
server:
bind_address: 0.0.0.0
port: 8080
limiter: false
secret_key: "1234567890"
public_instance: false
outgoing:
request_timeout: 3.0
proxies:
http: socks5h://user:password@127.0.0.1:9050
https: socks5h://user:password@127.0.0.1:9050
engines:
- name: ahmia
disabled: true
- name: torch
disabled: true
- name: duckduckgo
disabled: true
- name: startpage
disabled: true
Обращаем внимание на
SEARXNG_SECRET_KEY и secret_key они должны быть одинаковыми. Остальное интуитивно понятно. Да, еще если не нужна прокся, можешь закомментировать блок proxies, но рекомендую оставить, воткнуть луковицу либо приобрести быстрые socks5, либо поднять свои.Запускаем по классике. Заходим в браузере
<IP>:8080 и наслаждаемся. Через морду можно покрутить настройки, которых там жопой ешь. Следом прикручивается домен, SSL, basic auth. И по итогу имеешь свой независимый поисковик, без телеметрии и слежки.Для рядового пользователя это скорее игрушка, но у кого повышенная тревожность вполне зайдёт, тем более с поставленными задачами SearXNG отлично справляется.
Из минусов, не все поисковики лояльны, кто-то может запрашивать капчу, но на это есть официальное решение. Я его не пробовал, мне пока достаточно тех что у меня подключены сейчас.
И да если думаешь что DuckDuckGo панацея — неа, это компания в мудацкой стране под названием США, которая по первому запросу, сольет про тебя всё что на тебя есть, без зазрения совести. Потому что любая компания в США (CLOUD Act) по запросу суда, должна предоставить такие данные.
Если вы ищете что-то через DuckDuckGo, у компании нет вашего IP + истории запросов, чтобы связать эти запросы с вашей личностью. И поэтому даже если есть официальный запрос от ФБР, DuckDuckGo не сможет передать то, чего не хранит.
Не ведись на такое, это ПИЗДЁШЬ! Всё у них есть, не так много как у гугла, но есть, чтобы тебе смогли подвести писю к носу.
Век живи, век учись!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Я тут недавно на новогодние праздники затеял переезд на новый периметровый маршрутизатор. Раньше я использовал pfSense, но с недавнего времени он перестал обновляться. Да и скачать его проблематично. В общем решил переехать на opnSense.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Сразу скажу, что это уже вторая попытка. Первая попытка провалилась из-за регулярных падений и отваливая интернета.
Доходило до того, что пришлось ставить еженочную перезагрузку. Но, скорее всего это была вина не opnSense, а железа. Машина была старая, память не ECCшная. И вот теперь попытка номер два. На мой взгляд довольно успешная.
ㅤ
Все работает, как часы. На мой взгляд - интерфейс гораздо удобнее, чем у pfSense. Логичнее, что ли. Я не использую его на всю катушку - так, несколько WAN, LAN, DMZ и WI_FI. Все разведено физически, без VLAN.
Единственный затык был с настройкой DHCP. Я так и не понял, зачем туда воткнули три DHCP сервера (Dnsmasq, ISC DHCP, KEA DHCP) Может старшие товарищи объяснят. Немного пободавшись, я решил использовать Dnsmasq.
В общем, переезд прошел удачно. opnSense понравился. На мой взгляд, вполне можно использовать так замену pfSense.
Как установить arpwatch я не нашел, поэтому по традиции написал простенький csh-скрипт для оповещения появления в сети новых связок IP+mac.
Но это в следующий раз. Всем стабильных сетей.
🛠 #networks #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Сразу скажу, что это уже вторая попытка. Первая попытка провалилась из-за регулярных падений и отваливая интернета.
Доходило до того, что пришлось ставить еженочную перезагрузку. Но, скорее всего это была вина не opnSense, а железа. Машина была старая, память не ECCшная. И вот теперь попытка номер два. На мой взгляд довольно успешная.
ㅤ
Все работает, как часы. На мой взгляд - интерфейс гораздо удобнее, чем у pfSense. Логичнее, что ли. Я не использую его на всю катушку - так, несколько WAN, LAN, DMZ и WI_FI. Все разведено физически, без VLAN.
Единственный затык был с настройкой DHCP. Я так и не понял, зачем туда воткнули три DHCP сервера (Dnsmasq, ISC DHCP, KEA DHCP) Может старшие товарищи объяснят. Немного пободавшись, я решил использовать Dnsmasq.
В общем, переезд прошел удачно. opnSense понравился. На мой взгляд, вполне можно использовать так замену pfSense.
Как установить arpwatch я не нашел, поэтому по традиции написал простенький csh-скрипт для оповещения появления в сети новых связок IP+mac.
Но это в следующий раз. Всем стабильных сетей.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Настройка Yubikey + WSL2 + SSH (Часть 1)
Ставим YubiKey Manager, оно есть под все ОС, я буду ставить на винду и прокидывать ключ в WSL2. Под линукс это все работает из коробки, а вот с виндой + wsl 2— есть проблемы.
ㅤ
Вставляем Yubikey в USB, открываем Manager и проверяем, если всё ок, то ключ появляется. Дополнительно можно проверить в консоли командой:
Предварительно в ключ нужно зашить PIN, делается это через тот же Yubikey Manager в разделе Application → FIDO2 → FIDO2 PIN. Забиваем PIN.
Едем дальше. Прокинуть физический USB в WSL2 не так просто, но есть решение. Называется оно usbipd-win и позволяет прокинуть любую USB железяку внутрь пресловутого WSL2. Скачиваем установщик в разделе Releases и устанавливаем. Рутина.
Дальше еще интереснее. Открываем консоль PowerShell и запускаем:
И видим кучу устройств. Среди всего нужно найти Yubikey, у меня это:
Как я это понял? Да банально выткнул ключ из USB, прогнал команду, воткнул и снова прогнал, сравнил что появилось. А появилось именно это устройство, нам нужен его ID, у меня это
Если вылезет ошибка, в большинстве случаев это виндовый фаервол. У меня установлена морда TinyWall, я его на время отключаю. Позже уже добавлю нужные правила.
Так, теперь идем в WSL машину и выполняем
Кайф! Что-то прокинулось. Но что? Терпение!
У меня в WSL живет ubuntu 24, доставляем необходимые пакеты:
Проверяем:
Да сучка! Поздравляю, мы успешно прокинули USB железяку в WSL2. Нюансы! Кудаж без них. Сейчас ключ виден только руту, а нам надо обычному юзеру. Хакаем систему!
В WSL машине создаем файл
Не забываем вставить ID вендора и продукта, мы их выше уже получили и знаем.
Применяем:
Всё, для чистоты эксперимента можешь открыть новую консоль и убедиться что рядовой юзер теперь в деле.
Теперь можем генерить ключ и подключаться к серверам.
Продолжение будет завтра, всё в один пост не влезло. Завтра рассмотрим генерацию SSH ключей и как пофиксить баги при фрикциях с USB.
🛠 #security #privacy
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
TL:DR Настраиваем подключение по ssh к серверам с yubikey, без паролей, физических приватных ключей и смс. Заодно покажу как с помощью хака прокидывать физические USB устройства в WSL машину, авось захочется тебе что-то другое прокинуть и поковырять.
Ставим YubiKey Manager, оно есть под все ОС, я буду ставить на винду и прокидывать ключ в WSL2. Под линукс это все работает из коробки, а вот с виндой + wsl 2— есть проблемы.
ㅤ
Вставляем Yubikey в USB, открываем Manager и проверяем, если всё ок, то ключ появляется. Дополнительно можно проверить в консоли командой:
ykman info в ответ получен:Device type: YubiKey 5 NFC
Serial number: 12345678
Firmware version: 5.7.4
Form factor: Keychain (USB-A)
Enabled USB interfaces: OTP, FIDO, CCID
NFC transport is enabled.
Предварительно в ключ нужно зашить PIN, делается это через тот же Yubikey Manager в разделе Application → FIDO2 → FIDO2 PIN. Забиваем PIN.
PIN можно установить из консоли винды, командой: ykman fido access change-pin. Но если есть морда, то быстрее и приятнее сделать это через морду.
Едем дальше. Прокинуть физический USB в WSL2 не так просто, но есть решение. Называется оно usbipd-win и позволяет прокинуть любую USB железяку внутрь пресловутого WSL2. Скачиваем установщик в разделе Releases и устанавливаем. Рутина.
Дальше еще интереснее. Открываем консоль PowerShell и запускаем:
usbipd list
И видим кучу устройств. Среди всего нужно найти Yubikey, у меня это:
3-2 1050:0407 USB-устройство ввода, Устройство чтения смарт-карт Micros...
Как я это понял? Да банально выткнул ключ из USB, прогнал команду, воткнул и снова прогнал, сравнил что появилось. А появилось именно это устройство, нам нужен его ID, у меня это
1050:0407.usbipd bind --busid 3-2
usbipd attach --wsl --busid 3-2
Если вылезет ошибка, в большинстве случаев это виндовый фаервол. У меня установлена морда TinyWall, я его на время отключаю. Позже уже добавлю нужные правила.
Нахуя мне фаервол? Хочу держать под контролем софт, который у меня установлен, ну не нравится мне когда что-то утекает без моего ведома, тем более после «гугл приключений».
Так, теперь идем в WSL машину и выполняем
sudo lsusb, если всё ок то увидим:Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 1050:0407 Yubico.com Yubikey 4/5
Кайф! Что-то прокинулось. Но что? Терпение!
У меня в WSL живет ubuntu 24, доставляем необходимые пакеты:
sudo apt install -y yubikey-manager fido2-tools
Проверяем:
sudo ykman info
Device type: YubiKey 5 NFC
Serial number: 12345678
Firmware version: 5.7.4
Form factor: Keychain (USB-A)
Enabled USB interfaces: OTP, FIDO, CCID
NFC transport is enabled.
sudo fido2-token -L
/dev/hidraw1: vendor=0x1050, product=0x0407 (Yubico YubiKey)
Да сучка! Поздравляю, мы успешно прокинули USB железяку в WSL2. Нюансы! Кудаж без них. Сейчас ключ виден только руту, а нам надо обычному юзеру. Хакаем систему!
В WSL машине создаем файл
/etc/udev/rules.d/99-yubikey.rules:KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0407", MODE="0660", GROUP="plugdev", TAG+="uaccess"Не забываем вставить ID вендора и продукта, мы их выше уже получили и знаем.
Применяем:
sudo usermod -aG plugdev $USER
sudo udevadm control --reload-rules
sudo udevadm trigger
Всё, для чистоты эксперимента можешь открыть новую консоль и убедиться что рядовой юзер теперь в деле.
Теперь можем генерить ключ и подключаться к серверам.
Продолжение будет завтра, всё в один пост не влезло. Завтра рассмотрим генерацию SSH ключей и как пофиксить баги при фрикциях с USB.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1 30
Настройка Yubikey + WSL2 + SSH (Часть 2)
Первая часть тут: https://t.me/bashdays/1357
Создаём SSH ключ:
Оно запросит у тебя PIN который мы впендюрили в самом начале. Жмем несколько раз Enter и радуемся жизни. Новый приватный ключ создан, записан на Yubikey, публичная же часть ключа упала в
ㅤ
А дальше по классике. Закидываем публичную часть ключа на нужный сервер и пробуем подключиться:
Опа, прикасаемся своим обрубком к Yubikey и успешно подключаемся к серверу. Также можно сгенерить ключ, который не требует прикосновений, либо вообще сгенерить одноразовые пины, но это уже оверхед безопасность.
Фиксим баги:
После того как ты достанешь ключ из USB и затем воткнешь обратно. Всё к хуям сломается. Вот такая особенность винды и WSL2. Поэтому делаем финт ушами. Пишем powershell скрипт, который будет это фиксить.
Создаем файл
Не забываем изменить ID вендора и продукта. Закидываем скрипт в виндовый планировщик с параметрами:
Триггер:
- At log on (при входе в систему)
- On Event (событие USB)
- Log: System, Source:
Действие:
- Запуск
Теперь этот скрипт будет запускать при входе в систему ну и если ты будешь тыркать Yubikey туда-сюда в USB портах. Автоматизация ёпта!
Всё! Поставленная задача успешно решена. Что важно, тут не только потыкали Yubikey + SSH, но и научились прокидывать USB устройства в WSL2.
Всё остальное поищешь сам, информации полно. Я показал тебе лишь неочевидные штуки, которые могут загнать в тупик и свести с ума.
Изучай!
🛠 #security #privacy
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Первая часть тут: https://t.me/bashdays/1357
Создаём SSH ключ:
ssh-keygen -t ed25519-sk -O resident -C "shuba@bashdays"
Оно запросит у тебя PIN который мы впендюрили в самом начале. Жмем несколько раз Enter и радуемся жизни. Новый приватный ключ создан, записан на Yubikey, публичная же часть ключа упала в
~/.ssh/id_ed25519_sk.pub.ㅤ
Да, рядом будем лежать файл id_ed25519_sk, но это ничего не меняет, это не приватный ключ, приватный ключ НЕ хранится на диске, он сразу записывается в Yubikey. А то что ты видишь у себя на диске, это дескриптор (handle). Этот файл содержит идентификатор Yubikey ключа, параметры и ссылку на resident key. Приватный ключ физически находится внутри YubiKey и не может быть извлечён.
А дальше по классике. Закидываем публичную часть ключа на нужный сервер и пробуем подключиться:
ssh root@bashdays.ru
Confirm user presence for key ED25519-SK
Опа, прикасаемся своим обрубком к Yubikey и успешно подключаемся к серверу. Также можно сгенерить ключ, который не требует прикосновений, либо вообще сгенерить одноразовые пины, но это уже оверхед безопасность.
Про SSH ключи я подробно расписывал в серии постов по тегу #linuxfactory нажми на тег, получишь список всех этих постов. Настоятельно рекомендую ознакомиться, такому в школах не учат. По крайней мере не рассказывают нюансы.
Фиксим баги:
После того как ты достанешь ключ из USB и затем воткнешь обратно. Всё к хуям сломается. Вот такая особенность винды и WSL2. Поэтому делаем финт ушами. Пишем powershell скрипт, который будет это фиксить.
Создаем файл
YubiKeyAttachToWSL.ps1$yubiKeyBusId = (usbipd list | Select-String "1050:0407" |
ForEach-Object { $_.Line.Split()[0] })
if ($yubiKeyBusId) {
usbipd attach --wsl --busid $yubiKeyBusId
Write-Host "YubiKey attached…"
} else {
Write-Host "YubiKey not found."
}
Не забываем изменить ID вендора и продукта. Закидываем скрипт в виндовый планировщик с параметрами:
Триггер:
- At log on (при входе в систему)
- On Event (событие USB)
- Log: System, Source:
WudfUsbccidDrv, Event ID: 104Действие:
- Запуск
powershell.exe с аргументами -ExecutionPolicy Bypass -File "C:\YubiKeyAttachToWSL.ps1"Теперь этот скрипт будет запускать при входе в систему ну и если ты будешь тыркать Yubikey туда-сюда в USB портах. Автоматизация ёпта!
Всё! Поставленная задача успешно решена. Что важно, тут не только потыкали Yubikey + SSH, но и научились прокидывать USB устройства в WSL2.
Всё остальное поищешь сам, информации полно. Я показал тебе лишь неочевидные штуки, которые могут загнать в тупик и свести с ума.
Изучай!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Мифические продукты: мультивендорные NMS, автоматическое обнаружение устройств, построение топологии сети
26 февраля в 17:00 команда «Инфосистемы Джет» проведет открытый стрим, на котором разберет тему отсутствия по-настоящему мультивендорных решений и объяснит, почему универсальные системы управления сетью NMS до сих пор остаются скорее мечтой, чем реальностью. Эксперты расскажут, с какими архитектурными и технологическими ограничениями сталкиваются разработчики таких систем и к каким компромиссам приходят на практике. Отдельной темой станет ПО для автоматического обнаружения устройств и отрисовки сетевой топологии.
В программе стрима:
▪Ключевые функции (FCAPS) и компоненты систем управления сетью;
▪Разбор того, что получилось у создателей NMS Juniper Apstra: поддерживаемые архитектуры, производители, версии софта;
▪Проблематика создания NMS: подходы, транспорт, интерфейсы, формат данных, модели YANG, поддержка;
▪Системы отрисовки топологии: с доступом на оборудование и без доступа на оборудование;
▪Ответы спикеров на вопросы участников.
Стрим будет особенно полезен для специалистов, которые управляют сетевым оборудованием разных производителей, сталкиваются с ограничениями NMS и хотят разобраться в реальных возможностях и границах существующих технологий.
Чтобы попасть на стрим, не забудьте заранее зарегистрироваться на сайте.
26 февраля в 17:00 команда «Инфосистемы Джет» проведет открытый стрим, на котором разберет тему отсутствия по-настоящему мультивендорных решений и объяснит, почему универсальные системы управления сетью NMS до сих пор остаются скорее мечтой, чем реальностью. Эксперты расскажут, с какими архитектурными и технологическими ограничениями сталкиваются разработчики таких систем и к каким компромиссам приходят на практике. Отдельной темой станет ПО для автоматического обнаружения устройств и отрисовки сетевой топологии.
В программе стрима:
▪Ключевые функции (FCAPS) и компоненты систем управления сетью;
▪Разбор того, что получилось у создателей NMS Juniper Apstra: поддерживаемые архитектуры, производители, версии софта;
▪Проблематика создания NMS: подходы, транспорт, интерфейсы, формат данных, модели YANG, поддержка;
▪Системы отрисовки топологии: с доступом на оборудование и без доступа на оборудование;
▪Ответы спикеров на вопросы участников.
Стрим будет особенно полезен для специалистов, которые управляют сетевым оборудованием разных производителей, сталкиваются с ограничениями NMS и хотят разобраться в реальных возможностях и границах существующих технологий.
Чтобы попасть на стрим, не забудьте заранее зарегистрироваться на сайте.
В общем, поставил я себе opnSense и захотелось знать, не гуляют ли у меня в сети какие-нибудь «призраки». Решил написать скрипт для контроля связки IP-mac.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
У меня три подсети
ㅤ
И да, у меня там статика. Есть конечно и DHCP, но буквально на пару адресов, на всякий случай.
Скрипт пришлось разбить на две части, потому что у csh не очень красивые переносы очень длинных строк.
Этот скрипт сравнивает значения текущих IP и mac, со значениями, сохраненными в файле
Если появилась новая связка — отправляется сообщение в телеграм о ВРЕМЕНИ появления(контроля) новых данных в формате UNIXTIME, и новая связка IP-MAC сразу дописываются в справочник spr.
Сами данные в телегу не отправляются — чтобы узнать, что появилось, придется залезть на машину и посмотреть grep/tail. Сделано это специально, чтобы лишний раз не светить инфраструктуру.
Ставим его на cron
Основная часть на awk.
1. Анализируем только строки, в которых есть mac.
2. Файлы справочника и вывод arp разделяем по числу полей (в справочнике их три: unixtime ip mac).
3. Из вывода arp убираем все, что не относится к подсетям DMZ и LAN.
4. Тупо сравниваем связки каждый с каждым. (осторожно на больших подсетях, поскольку N^2).
5. Если что-то нашлось - errorlevel=1.
Все можно было бы сделать быстрее и проще, но очень хотелось:
6. Отказаться от временных файлов.(в opnSense нет /dev/shm).
7. Данные дописываются в тот же справочник, из которого читаются. Это можно сделать, потому что на момент анализа (блок END) данные из справочника уже считаны и файл закрыт.
Вопросы и предложения приветствуются.
В следующей статье попробую описать впечатления и с какими проблемами пришлось столкнуться.
UPD: В комментах скрипт на sh
🛠 #networks #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Первая часть тут: https://t.me/bashdays/1356
У меня три подсети
192.168.0.0 = DMZ 192.168.1.0 = LAN, 192.168.2.0 = WIFI. Что творится в сети WIFI, меня не очень интересует, поскольку доступа из неё нет не только к LAN, но и к DMZ. Поэтому наблюдать будем две последние.ㅤ
И да, у меня там статика. Есть конечно и DHCP, но буквально на пару адресов, на всякий случай.
Скрипт пришлось разбить на две части, потому что у csh не очень красивые переносы очень длинных строк.
#!/bin/csh
#checkarp.sh
set dt=`date "+%s"`
set bot_id=0000000000:AAAAAAAAA1_aaaaaaaaaaaaaaaaaaaaaaa1
set chat_id=1111111111
set text="GATE: Есть изменения arp $dt"
arp -an| \
awk -v dt=$dt -f "$0.awk" /dev/stdin "$0.spr" >>"$0.spr"
if ( $status != 0 ) then
curl -s -X POST https://api.telegram.org/bot$bot_id/sendMessage \
-F chat_id="$chat_id" -F text="$text" >/dev/null
endif
Этот скрипт сравнивает значения текущих IP и mac, со значениями, сохраненными в файле
checkarp.sh.spr. Если появилась новая связка — отправляется сообщение в телеграм о ВРЕМЕНИ появления(контроля) новых данных в формате UNIXTIME, и новая связка IP-MAC сразу дописываются в справочник spr.
Сами данные в телегу не отправляются — чтобы узнать, что появилось, придется залезть на машину и посмотреть grep/tail. Сделано это специально, чтобы лишний раз не светить инфраструктуру.
Ставим его на cron
*/15, потому что время жизни arp 20 минут (видно из вывода arp). Работает под обычным пользователем.#checkarp.sh.awk
/[0-9a-f]{2}(:[0-9a-f]{2}){5}/{
if(NF==3){spr[$2 " " $3]}
else{ if( NF>3 && $0~/192\.168\.[01]\./){gsub(/[()]/, "", $0); arp[$2 " " $4]}}
}
END{
ret=0
for(i in arp){
seek=0
for(j in spr){
if(i==j){
seek=1; break
}
}
if(seek==0){ret=1; print dt, i}
}
exit ret
}
Основная часть на awk.
1. Анализируем только строки, в которых есть mac.
2. Файлы справочника и вывод arp разделяем по числу полей (в справочнике их три: unixtime ip mac).
3. Из вывода arp убираем все, что не относится к подсетям DMZ и LAN.
4. Тупо сравниваем связки каждый с каждым. (осторожно на больших подсетях, поскольку N^2).
5. Если что-то нашлось - errorlevel=1.
Все можно было бы сделать быстрее и проще, но очень хотелось:
6. Отказаться от временных файлов.(в opnSense нет /dev/shm).
7. Данные дописываются в тот же справочник, из которого читаются. Это можно сделать, потому что на момент анализа (блок END) данные из справочника уже считаны и файл закрыт.
Вопросы и предложения приветствуются.
man arp awk(gawk)
В следующей статье попробую описать впечатления и с какими проблемами пришлось столкнуться.
UPD: В комментах скрипт на sh
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем параноить. Сегодня будем создавать шифрованную капсулу времени. То есть зашифрованные данные, невозможно будет расшифровать до какой-то определенной даты.
Для реализации желаемого, воспользуемся утилитой под названием
TLock — это шифрование с отложенным доступом, которое опирается на доверенную аппаратную среду (TEE, чаще всего Intel SGX). Идея всего этого безумия до безобразия простая и красивая:
— данные шифруются сейчас
— ключ не существует в открытом виде
— расшифровка после определённого времени
— даже владелец не может ускорить процесс
ㅤ
Есть TEE (Trusted Execution Environment), работает на drand (League of Entropy) + threshold BLS + Identity-Based Encryption. Дада, Artmoney тут тебе не поможет. Внутри TEE генерируется секрет, считается время, вычисляется ключ.
Пока время не наступило, ключ не вычисляется, не извлекается, не брутфорсится. Даже если ты владелец и у тебя есть дампы памяти, у тебя нихуя не получится ничего дешифровать.
Короче это нифига не cron + sleep, timestamp и т.п. Это прям технолоджи!
Устанавливаем:
1. Качаем бинарник для своей ОС: https://github.com/drand/tlock/releases/
2. Кидаем куда удобно, я закинул в
Создаем условный файл:
Шифруем:
Этот файл можно будет расшифровать только через 10 дней. Если сейчас посмотреть файл
Попробуем расшифровать:
И получаем:иди нахуй
Пример в псевдокоде:
-
-
-
Ключей и опций у этой штуковины дофига и больше, поэтому если интересно можешь сам их поизучать. Я принес тебе интересный инструмент, а дальше ты уж сам найди ему применение.
Век живи, век учись. Кстати эта технология применяется в крипте, насколько знаю в Ethereum.
Кстати для шифрования бекапов прям прикольная штука, юморная.
🛠 #security #privacy
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Очень удобно, если ты умер и хочешь чтобы твой отпрыск получил по наследству пароли от золотой коллекции прона, которую ты собирал 30 лет. Но ларчик должен открыться строго в 18 лет.
Для реализации желаемого, воспользуемся утилитой под названием
tlock. TLock — это шифрование с отложенным доступом, которое опирается на доверенную аппаратную среду (TEE, чаще всего Intel SGX). Идея всего этого безумия до безобразия простая и красивая:
— данные шифруются сейчас
— ключ не существует в открытом виде
— расшифровка после определённого времени
— даже владелец не может ускорить процесс
ㅤ
Есть TEE (Trusted Execution Environment), работает на drand (League of Entropy) + threshold BLS + Identity-Based Encryption. Дада, Artmoney тут тебе не поможет. Внутри TEE генерируется секрет, считается время, вычисляется ключ.
Ключ == f(секрет, время)
Пока время не наступило, ключ не вычисляется, не извлекается, не брутфорсится. Даже если ты владелец и у тебя есть дампы памяти, у тебя нихуя не получится ничего дешифровать.
Короче это нифига не cron + sleep, timestamp и т.п. Это прям технолоджи!
Устанавливаем:
1. Качаем бинарник для своей ОС: https://github.com/drand/tlock/releases/
2. Кидаем куда удобно, я закинул в
/usr/local/sbinСоздаем условный файл:
cd /tmp
echo "hello bashdays" >> bashdays.txt
Шифруем:
tle -e -D 10d -o bashdays.tlock bashdays.txt
Этот файл можно будет расшифровать только через 10 дней. Если сейчас посмотреть файл
bashdays.tlock то увидим кучу мусора:age-encryption.org/v1
-> tlock 26260588 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971
jhUpzCk/LXUTkwghwKbyGH1gZ2BEy3p47X4yf+8qrv7+BIhJvEUK6QsVZNnZupxK
CsP1d2kGQAsy6GfEc544aZURB3zK3999bQbXzuhA0u4JV0J27ZqnjKBdtx2az603
tF54aRojO3OmwC2JNTkO/ObQID2xJTTidpgP8K1AEac
--- pN0y6uBfL8KOcoXKp1U6T0gbrWrgDoCmwJxBZ7LHspw
#�4x�&V����S�&e`�S�`���
z��? �A��%
Попробуем расшифровать:
tle -d -o bashdays.txt bashdays.tlock
И получаем:
too early to decrypt: expected round 26260588 > 25972610 current round. Файл можно будет расшифровать только через 10 мать его дней. И пофигу root ты или супер ксакеп, нихуя у тебя не получится проникнуть в эту капсулу времени.Пример в псевдокоде:
# encryption
ciphertext = TLock.encrypt(
data=plaintext,
unlock_time=TIMESTAMP
)
# decryption
if now() >= TIMESTAMP:
plaintext = TLock.decrypt(ciphertext)
else:
raise Nope("слишком рано")
-
key нигде не лежит-
key нельзя украсть-
key нельзя вычислить заранееКлючей и опций у этой штуковины дофига и больше, поэтому если интересно можешь сам их поизучать. Я принес тебе интересный инструмент, а дальше ты уж сам найди ему применение.
Век живи, век учись. Кстати эта технология применяется в крипте, насколько знаю в Ethereum.
Кстати для шифрования бекапов прям прикольная штука, юморная.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
В последних двух моих статьях я рассказывал о том, как я перешел с pfSense на opnSense и попытался заменить arpwatchd самописным скриптом. Здесь я расскажу, с какими «проблемами» пришлось столкнуться.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Началось с того, что я тупанул. Я знал, что pfSense и opnSense основаны на BSD, и знал, что обычно там отсутствует bash.
ㅤ
И почему-то подумал, что придется писать скрипт на csh (tsch). Я не знаю csh, но принципиальных отличий нет.
Ну, скрипт и скрипт. Небольшие отличия в синтаксисе.
Это делает однострочники (в моем случае awk) крайне уродливыми. Когда скрипт уже работал, я решил проверить, какие там есть оболочки
Ладно, потратил лишних пару дней, но приобрел опыт. Винить некого. Но плюс в том, что если знаешь bash - в случае крайней необходимости можешь написать скрипт и для другой оболочки.
Были небольшие затыки с программами. Вроде
Что порадовало, так это наличие man в opnSense. В pfSense его не было. И это очень круто.
Очень жаль, что не нашел
Ну, и еще одной проблемой стал редактор vi, который оказался единственным в системе!!!
Я в последнее время использую vim (который начал изучать после рекомендаций Дмитрия Малинина здесь, на BashDays. За что ему спасибо.) Кто еще не начал - ставьте vim, и запускайте vimtutor. Этого будет достаточно, чтобы как-то работать в vi и vim.
Вывод из всего этого - nix это круто. И не важно - Linux или BSD. Они очень похожи, по крайней мере, если знаешь что-то одно - разобраться не проблема. Принципы одинаковые.
Холиваров прошу не устраивать. Просто решил поделиться опытом. Если где-то ошибся - поправьте.
🛠 #networks #linux #bash
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Первая статья: https://t.me/bashdays/1356
Вторая статья: https://t.me/bashdays/1360
Началось с того, что я тупанул. Я знал, что pfSense и opnSense основаны на BSD, и знал, что обычно там отсутствует bash.
ㅤ
И почему-то подумал, что придется писать скрипт на csh (tsch). Я не знаю csh, но принципиальных отличий нет.
Ну, скрипт и скрипт. Небольшие отличия в синтаксисе.
if и while присутствуют, значит проблем нет. Это действительно так. Самой большой проблемой стал перенос длинных строк даже в константах:#!/bin/bash
echo '1
2
3'
#!/bin/csh
echo '1 \
2 \
3'
Это делает однострочники (в моем случае awk) крайне уродливыми. Когда скрипт уже работал, я решил проверить, какие там есть оболочки
cat /etc/shells , и с изумлением обнаружил /bin/sh.Ладно, потратил лишних пару дней, но приобрел опыт. Винить некого. Но плюс в том, что если знаешь bash - в случае крайней необходимости можешь написать скрипт и для другой оболочки.
Были небольшие затыки с программами. Вроде
date, как date, но ключики немного не совпадают. Я думал там gawk, но нет, awk. (не нашел разделы BEGINFILE{...} ENDFILE{...}). Но, при большом желании можно обойтись и без них.Что порадовало, так это наличие man в opnSense. В pfSense его не было. И это очень круто.
Очень жаль, что не нашел
ramdisk /dev/shm (в Linux он обычно есть и под него выделено половину оперативки).Ну, и еще одной проблемой стал редактор vi, который оказался единственным в системе!!!
ed, red, sed не в счет, хотя, если припрет... В pfSense был еще nano.Я в последнее время использую vim (который начал изучать после рекомендаций Дмитрия Малинина здесь, на BashDays. За что ему спасибо.) Кто еще не начал - ставьте vim, и запускайте vimtutor. Этого будет достаточно, чтобы как-то работать в vi и vim.
Вывод из всего этого - nix это круто. И не важно - Linux или BSD. Они очень похожи, по крайней мере, если знаешь что-то одно - разобраться не проблема. Принципы одинаковые.
Холиваров прошу не устраивать. Просто решил поделиться опытом. Если где-то ошибся - поправьте.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Контекстная конфигурация в git
При работе с git репозиториями, частенько попадаешь в просак с таким:
Один раз забил свои явки-пароли и затем git при любом коммите или пуше будет подставлять эти данные. То есть в историю коммитов будет забиваться
ㅤ
Но если у тебя смешаны личные и рабочие репозитории, начинается цирк с конями. Я тысячу раз комитил в рабочую репу под личным
Из этой ситуации можно выйти по-разному, кто-то изобретает безумные Bash скрипты или пишет хуки, кто-то постоянно правит конфиги перед пушем. Короче костыль на костыле. Но есть решение лучше и нативнее.
Расчехляем хоумлабу!
У нас будет 2 папки:
Настраиваем основной конфиг:
Нюанс:
Создаем рабочий конфиг
На этом танцы с бубном закончились, проверяем:
Ага, видим что для личных проектов будет применяться
Да твоюж мать! Видим
Всё, мы успешно разделили контекст между личными и рабочими проектами. Таких инклудов ты можешь насоздавать сколько угодно. Самое главное это работает без костылей и каких-то лишних обвесов вокруг git.
Git скрывает очень много интересного и не всегда это очевидно. Такие дела, изучай!
🛠 #devops #linuxfactory #dev
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
При работе с git репозиториями, частенько попадаешь в просак с таким:
git config --global user.name
git config --global user.email
Один раз забил свои явки-пароли и затем git при любом коммите или пуше будет подставлять эти данные. То есть в историю коммитов будет забиваться
user.name и user.email. Это логично и понятно.ㅤ
Но если у тебя смешаны личные и рабочие репозитории, начинается цирк с конями. Я тысячу раз комитил в рабочую репу под личным
user.name и user.email и получал за это по рукам. Получал конечно сам от себя. Потому что смешивать личное и рабочее — фуфу!
Из этой ситуации можно выйти по-разному, кто-то изобретает безумные Bash скрипты или пишет хуки, кто-то постоянно правит конфиги перед пушем. Короче костыль на костыле. Но есть решение лучше и нативнее.
Расчехляем хоумлабу!
У нас будет 2 папки:
mkdir -p ~/projects/personal
mkdir -p ~/projects/work
Настраиваем основной конфиг:
vim ~/.gitconfig
[user]
name = Roman Shubin
email = shuba@bashdayz.ru
[includeIf "gitdir:~/projects/work/"]
path = ~/.gitconfig_work
Нюанс:
/ в конце work обязателен. Git интерпретирует gitdir: как префикс пути к каталогу .git.Создаем рабочий конфиг
~/.gitconfig_work[user]
name = Linux Factory
email = exe@linuxfactory.ru
На этом танцы с бубном закончились, проверяем:
mkdir -p ~/projects/personal/app
cd ~/projects/personal/app
git init
git config user.email
git config --show-origin user.email
Ага, видим что для личных проектов будет применяться
shuba@bashdayz.ru и берется он из ~/.gitconfig. Последние 2 команды, как раз выводят эту информацию в терминал. Хорошо, теперь:mkdir -p ~/projects/work/app
cd ~/projects/work/app
git init
git config user.email
git config --show-origin user.email
Да твоюж мать! Видим
Linux Factory и exe@linuxfactory.ru. Что и требовалось доказать, данные берутся из файла ~/.gitconfig_work. Всё, мы успешно разделили контекст между личными и рабочими проектами. Таких инклудов ты можешь насоздавать сколько угодно. Самое главное это работает без костылей и каких-то лишних обвесов вокруг git.
Git скрывает очень много интересного и не всегда это очевидно. Такие дела, изучай!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1 83
Как развернуть приватную большую языковую модель в Kubernetes
Selectel приглашает на вебинар, где покажут полный процесс развертывания модели — от подготовки инфраструктуры до создания интерфейса и настройки мониторинга.
📅 12 марта, 12:00
📍 Онлайн
👥Для инженеров DevOps, специалистов по эксплуатации и архитекторов ИТ-инфраструктуры.
👉Смотрите полную программу и регистрируйтесь: https://slc.tl/53nbd
Чтобы не пропустить вебинар и узнавать о других событиях и бесплатных курсах Selectel, подписывайтесь на @selectel_events
Реклама, АО «Селектел», erid: 2VtzqwibA5J
Selectel приглашает на вебинар, где покажут полный процесс развертывания модели — от подготовки инфраструктуры до создания интерфейса и настройки мониторинга.
📅 12 марта, 12:00
📍 Онлайн
👥Для инженеров DevOps, специалистов по эксплуатации и архитекторов ИТ-инфраструктуры.
👉Смотрите полную программу и регистрируйтесь: https://slc.tl/53nbd
Чтобы не пропустить вебинар и узнавать о других событиях и бесплатных курсах Selectel, подписывайтесь на @selectel_events
Реклама, АО «Селектел», erid: 2VtzqwibA5J
Фарш обратно не провернёшь
ㅤ
Порой в Bash поделках требуется создать какой-нибудь секрет, для дальнейшей его передачи в CI/CD или куда-то еще. Ежу понятно, это можно сделать «в лоб», но мыж с тобой не волки позорные, поэтому давай сделаем это по всем правилам DevSecOps Best Practice. (* лучшие практики безопасной разработки).
Задача: Создать безопасно секрет, чтобы его не спиздили (например из свапа при форензике).
Кто-то извращается со
Наш вариант это —
Что тут происходит?
Ничего необычного, генерим 32 случайных байта, кодируем в base64, получаем пароль высокой энтропии, затем через
Ну и в конце скармливаем какой-нибудь утилите или в CI/CD, куда нужно передать секрет, в моем случае я передал его в openssl.
По итогу секрет, не попадает в history, не лежит на диске и временно находится в памяти. Но важно понимать, что после
А еще оно может попасть в swap и это еще хуже, swap это прям как неочищенная «корзина» с удаленными файлами.
На bash этот момент описать наверное не получится, поэтому покажу как сделать на Сиськах. Будем использовать
Когда этот код будет вызывать
Получается что сначала
Кстати
Блокируется вся текущая и будущая память процесса, активно применяется демонами в HashiVault.
Такие дела.
Накидай еще своих вариантов в комменты, будет интересно ознакомиться.
🛠 #dev #security #bash
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Порой в Bash поделках требуется создать какой-нибудь секрет, для дальнейшей его передачи в CI/CD или куда-то еще. Ежу понятно, это можно сделать «в лоб», но мыж с тобой не волки позорные, поэтому давай сделаем это по всем правилам DevSecOps Best Practice. (* лучшие практики безопасной разработки).
Задача: Создать безопасно секрет, чтобы его не спиздили (например из свапа при форензике).
Форензика — это направление информационной безопасности, связанное с анализом и восстановлением данных для расследования инцидентов
Кто-то извращается со
shred и т.п. утилитами, но это избыточно, да и на SSD, Btrfs, ZFS и journal FS оно будет работать хуева и не гарантирует физическое уничтожение данных. Лучше на диск вообще ничего не писать.Наш вариант это —
pipe через printf. Можно конечно усложнить и сделать через анонимный файловый дескриптор, но получаются те же грабли только сбоку, смысла усложнять нет.#!/usr/bin/env bash
set -euo pipefail
SECRET="$(openssl rand -base64 32)"
printf '%s' "$SECRET" | \
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 200000 \
-in input.txt \
-out output.enc \
-pass stdin
unset SECRET
Что тут происходит?
Ничего необычного, генерим 32 случайных байта, кодируем в base64, получаем пароль высокой энтропии, затем через
printf передаем пароль (без \n) через pipe в stdin. Ну и в конце скармливаем какой-нибудь утилите или в CI/CD, куда нужно передать секрет, в моем случае я передал его в openssl.
По итогу секрет, не попадает в history, не лежит на диске и временно находится в памяти. Но важно понимать, что после
unset SECRET переменная удаляется только из таблицы переменных, в памяти эта переменная может по-прежнему храниться и быть уязвима к форензике. Поэтому носи это в голове и по возможности перезатирай память например тем же stress.А еще оно может попасть в swap и это еще хуже, swap это прям как неочищенная «корзина» с удаленными файлами.
На bash этот момент описать наверное не получится, поэтому покажу как сделать на Сиськах. Будем использовать
mlock().#include <sys/mman.h>
#include <string.h>
#include <stdio.h>
int main() {
char secret[32] = "super_secret_password";
if (mlock(secret, sizeof(secret)) != 0) {
perror("mlock failed");
return 1;
}
printf("Secret in locked memory\n");
// Используем секрет...
memset(secret, 0, sizeof(secret)); // затираем
munlock(secret, sizeof(secret));
return 0;
}
Когда этот код будет вызывать
mlock(), указанный диапазон памяти закрепляется в RAM и ядро не имеет права выгружать его в swap.Получается что сначала
mlock() блокирует участок памяти, затирает memset() её перед освобождением и с помощью munlock() снимает блокировку.Кстати
mlock() используют GnuPG, OpenSSH, HashiVault, KeePassXX. Так что вариант надежный, можешь не сомневаться. А еще иногда используется mlockall():mlockall(MCL_CURRENT | MCL_FUTURE);
Блокируется вся текущая и будущая память процесса, активно применяется демонами в HashiVault.
Такие дела.
Накидай еще своих вариантов в комменты, будет интересно ознакомиться.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1 39