acme.sh - это полностью bash-скрипт для работы с Lets Encrypt и другими ACME-совместимыми центрами сертификации. Он не требует python, библиотек или дополнительных пакетов, достаточно стандартного окружения linux. Именно легкость, автономность и гибкость сделали его популярной альтернативой certbot.
curl https://get.acme.sh | sh -s email=you@networkadmin.ru
Инсталлятор делает все автоматически:
Размещает скрипт в
~/.acme.sh/Добавляет алиас
acme.sh в .bashrcСоздает cron задачу для автообновления сертификатов
После перезапуска среды можно сразу работать.
acme.sh --issue --server letsencrypt -d networkadmin.ru -w /var/www/html
Для каждого домена создается отдельная директория
~/.acme.sh/networkadmin.ru/, где хранятся:приватный ключ
сертификат
конфигурация домена
acme.sh:
acme.sh --install-cert -d networkadmin.ru \
--key-file /etc/nginx/certs/key.pem \
--fullchain-file /etc/nginx/certs/cert.pem \
--reloadcmd "systemctl reload nginx"
Теперь при автообновлении сертификатов
acme.sh сам скопирует файлы и перезагрузит веб-сервер.acme.sh? Главные преимущества:~/.acme.sh, не трогают системные каталоги.#letsencrypt #ssl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥1
Многие знают про
tree, но мало кто знает про broot. Это консольный инструмент для навигации по файловой системе, который сочетает просмотр дерева, поиск, переходы и фильтры в одном интерфейсе.
curl -fsSL https://dystroy.org/broot/install.sh | bash
После установки появится командный алиас
br, запускающий интерактивный браузер.
nginx
cd ../../../../../.открыть в редакторе (e)
удалить (:rm)
показать подробности (:p)
копировать путь (:pp)
- Показать размеры каталогов:
br -s- Открывать сразу в режиме изменения (как F2 в файловых менеджерах):
br -c :focus- Фильтровать только директории:
type:d#linux #tools
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
Если после обновления, кривой установки windows или повреждения разделов linux перестал загружаться, то почти всегда можно вернуть систему к жизни, просто восстановив GRUB.
lsblk
Ищем раздел, где стоит linux, например
/dev/sda2.Если отдельный
/boot существует, то запомните и его.
sudo mount /dev/sda2 /mnt
Если есть отдельный
/boot:
sudo mount /dev/sda1 /mnt/boot
И обязательно системные каталоги:
for i in /dev /proc /sys /run; do sudo mount --bind $i /mnt$i; done
sudo chroot /mnt
Теперь вы внутри установленной системы, как будто загрузились в нее.
BIOS/Legacy
grub-install /dev/sda
update-grub
UEFI
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
update-grub
Если каталог
/boot/efi не смонтирован, то смонтируйте нужный EFI-раздел (lsblk -f покажет FAT32):
mount /dev/sda1 /boot/efi
exit
sudo reboot
Если все сделано правильно система загрузится снова.
Если после восстановления GRUB старая windows не отображается, выполните:
os-prober && update-grub
Если GRUB ставится, но меню не появляется, включите отображение:
GRUB_TIMEOUT_STYLE=menu
При поврежденном ядре можно вручную выбрать старое в меню Advanced options.
#linux #grub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🔥1
Хочу поделиться полезным инструментом, который часто упоминают в контексте пентестов, но который одинаково удобен и администраторам: Chisel. Это один бинарник (на Go) и для сервера, и для клиента доступный для linux, windows, macOS. Работает поверх HTTP, поэтому его очень просто поднять там, где открыт веб-порт.
./chisel server --port 80 --socks5
На клиенте (локальная машина, откуда хотите выходить в интернет через сервер):
./chisel client http://server.example.com:80 socks
После этого в браузере можно указать SOCKS5 proxy 127.0.0.1:1080, трафик пойдет через сервер.
На публичном сервере:
./chisel server --port 80 --reverse
На внутреннем хосте (тот, к которому хотим подключиться):
./chisel client http://server.example.com:80 R:2222:localhost:22
Теперь на публичном сервере можно подключиться к внутреннему хосту:
ssh -p 2222 root@127.0.0.1
--reverse. На внутреннем клиенте даем правило:
./chisel client http://server.example.com:80 33306:127.0.0.1:3306
После этого на клиенте MySQL будет доступен локально на порту 33306.
Аутентификация: есть опция
--auth user:pass и на сервере, и на клиенте, используйте для защиты туннеля.Маскировка:
--backend позволяет прятать chisel-сервер за обычным веб-сервером (перенаправлять чужие HTTP-запросы), что облегчает развертывание в средах с ограничениями.Один бинарник, удобно распространять и для разных ОС.
#network #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3
Полезное напоминание в преддверии новогодних праздников - проверить бэкапы и свободное место
df -h
du -h -d 1 / | sort -hr
du -hs /* | sort -hr
Ограничиваем вывод:
du -h -d 1 / | sort -hr | head -10
Топ 20 самых объемных директорий:
du -hcx --max-depth=6 / | sort -rh | head -n 20
Топ 20 самых больших файлов:
find / -mount -ignore_readdir_race -type f -exec du -h "{}" + 2>&1 \
| sort -rh | head -n 20
df -ih
du показывает меньше, чем df, виноваты могут быть процессы, держащие удалённые файлы:
lsof | grep '(deleted)'
lsof +L1
Если видите большие файлы - перезапустите сервис или убейте зависший процесс:
kill -9 <pid>
Классическая ловушка: данные пишутся в
/mnt/backup, но диск в момент копирования не смонтирован. Файлы падают на корневую ФС, а после монтирования становятся невидимыми, но место продолжают занимать.Если суммарный размер файлов меньше занятого места, а удаленных файлов нет, то почти наверняка проблема в такой ложной точке монтирования.
#linux #storage
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥3
Встроенный брандмауэр windows по умолчанию не пишет логи о входящих и исходящих соединениях, которые он блокирует. Из-за этого сложно понять, кто виноват: само приложение, сеть или firewall. Многие в такой ситуации просто отключают защиту целиком, но это плохая практика.
Куда правильнее включить логирование DROP-пакетов, посмотреть, что именно блокируется (порт, IP, протокол), и уже после этого создать точечное правило.
Set-NetFireWallProfile -Profile Public `
-LogBlocked True `
-LogMaxSize 20480 `
-LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log" `
-Verbose
После включения логи будут появляться в файле
pfirewall.log. В них видно источник, порт, направление и действие (DROP/ALLOW).
Auditpol /set /category:"System" /SubCategory:"Filtering Platform Packet Drop" /failure:enable
После этого записи о блокировках появятся в:
Event Viewer → Windows Logs → Security#windows #firewall
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Я думаю, что все устали и всем пора отдыхать, набираться сил. Все дедлайны позади, а о будущих думать пока не стоит!
Я пожелаю Вам хороших каникул, счастья, здоровья, поменьше выгорания и успехов в новом году!
С наступающим, 2026!
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11🍾9💩3❤2
Small HTTP Server - программа родом из эпохи Windows 95 и NT, но до сих пор развивается. Написана на C++, невероятно компактная - установщик весит всего около 1 МБ.
Программа доступна под Windows, Linux и ARM, отличный вариант для маломощных одноплатников.
Все службы настраиваются через удобный веб-интерфейс со статистикой. Конфигурация хранится в обычном текстовом файле. На Windows сервер запускается просто запуском EXE, по умолчанию работает как файловый листинг каталога. Можно установить как службу.
#utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤3🔥2
curl -o - https://get.docker.com | bash -
Запустить контейнер как службу (автостарт, проброс порта)
docker run -d -p 80:80 --restart always --name nginx-proxy nginx
Список контейнеров
docker ps # только запущенные
docker ps -a # все
Удаление контейнера
docker rm nginx-proxy # остановленного
docker rm -f nginx-proxy # принудительно
Остановить и удалить все контейнеры
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
Просмотр и удаление
docker images
docker rmi nginx # удалить один
docker rmi $(docker images -aq) # удалить все
Вход в bash
docker exec -it nginx-proxy bash
Логи
docker logs nginx-proxy
docker logs -n 100 nginx-proxy
docker logs -f nginx-proxy
Запущенные процессы
docker top nginx-proxy
Статистика ресурсов
docker stats nginx-proxy
docker stats prometheus exporter
docker stats prometheus --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
Информация о контейнере
docker inspect nginx-proxy
docker inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' nginx-proxy
docker inspect --format '{{json .Mounts}}' grafana | jq .
Проверить занимаемое место
docker system df
Очистить мусор
docker system prune
Копирование файлов
docker cp nginx-proxy:/etc/nginx/nginx.conf ~/nginx
docker cp ~/nginx/nginx.conf nginx-proxy:/etc/nginx
Экспорт файловой системы контейнера
docker export nginx-proxy -o ~/nginx-proxy.tar.gz
#docker
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Сегодня почти любой сервис требует HTTPS. Даже если ресурс локальный или временный, браузеры без сертификата засыпают предупреждениями. Если нет внешнего доступа для Lets Encrypt, приходится копировать сертификаты вручную или постоянно продлевать их.
Гораздо удобнее выпустить свой корневой CA, добавить его в доверенные и генерировать сертификаты под любые домены/IP с любым сроком (хоть на 9999 дней). Покажу, как сделать это для Nginx.
В примере выпускаем сертификат для домена zabbix.internal и IP
192.168.77.55.
mkdir ~/tls && cd ~/tls
openssl ecparam -out myCA.key -name prime256v1 -genkey
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 9999 -out myCA.crt
На вопросы можно отвечать что угодно, это локальный CA.
openssl genrsa -out zabbix.internal.key 2048
openssl req -new -key zabbix.internal.key -out zabbix.internal.csr
mcedit zabbix.internal.ext
Добавляем:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.77.55
DNS.1 = zabbix.internal
openssl x509 -req -in zabbix.internal.csr -CA myCA.crt -CAkey myCA.key \
-CAcreateserial -out zabbix.internal.crt -days 9999 -sha256 -extfile zabbix.internal.ext
mkdir /etc/nginx/certs
cp zabbix.internal.crt /etc/nginx/certs/
cp zabbix.internal.key /etc/nginx/certs/
Создаем DH-параметры:
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
listen 443 http2 ssl;
server_name zabbix.internal 192.168.77.55;
ssl_certificate /etc/nginx/certs/zabbix.internal.crt;
ssl_certificate_key /etc/nginx/certs/zabbix.internal.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
Перезапуск:
nginx -t
nginx -s reload
Передайте файл myCA.crt на свой ПК и добавьте в хранилище доверенных сертификатов.
Если нужно доверить CA прямо на Debian:
cp myCA.crt /usr/local/share/ca-certificates/
update-ca-certificates
Теперь можно заходить на сайт по доменному имени или IP, браузер будет полностью доверять сертификату.
#webserver
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤1👍1🤡1
Если вы работаете с Ansible, рано или поздно возникает вопрос: куда девать пароли, ключи, токены и прочее? Хранить их в открытом виде в репозитории - явно плохая идея. Для этого существует Ansible Vault - встроенный механизм шифрования файлов и переменных.
Vault позволяет безопасно хранить секреты прямо в плейбуках или отдельных файлах, а ansible будет расшифровывать их при выполнении. Все просто, удобно и без лишних зависимостей.
ansible-vault create secrets.yml
Откроется редактор, куда можно вписать переменные, например:
db_user: admin
db_pass: S3cretP@ss
Файл автоматически сохранится в зашифрованном виде.
ansible-vault edit secrets.yml
ansible-vault decrypt secrets.yml
И обратно:
ansible-vault encrypt secrets.yml
vars_files:
- secrets.yml
А запуск плейбука выглядит так:
ansible-playbook site.yml --ask-vault-pass
ansible-vault encrypt_string 'P@ssw0rd!' --name 'db_pass'
#ansible
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍2
Если нужно быстро оценить, как PostgreSQL чувствует себя на разных типах дисков, файловых системах или конфигурациях виртуалок, необязательно глубоко погружаться в тюнинг СУБД. Достаточно воспользоваться встроенной утилитой
pgbench, она идет в комплекте с PostgreSQL и позволяет получить базовые, но показательные метрики.
apt install postgresql
Проверяем работу службы:
systemctl status postgresql
Создаем тестовую базу:
su - postgres
psql
create database test_db;
\q
Инициализируем тестовые данные, увеличив объём в 10 раз:
pgbench -i test_db -s 10
pgbench test_db -c 5 -j 2 -P 5 -T 60
Пример результата:
number of transactions actually processed: 219950
latency average = 1.362 ms
tps = 3665.930847
СУБД обработала 219 950 транзакций со скоростью ~3666 TPS, это и есть показатель, который удобно использовать для сравнения.
По умолчанию запускается смесь операций, напоминающая TPC-B: внутри одной транзакции идут SELECT, UPDATE и INSERT. Можно использовать свои сценарии, создавая кастомные SQL-скрипты. В документации PostgreSQL (в том числе русской) всё подробно описано.
#postgresql
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Если вам нужно, чтобы пользователи запускали через RDP не целый рабочий стол, а только определенное приложение, то для этого подойдет режим RemoteApp. Он чаще ассоциируется с серверами windows, но его реально настроить и на обычной win 10/11.
1. Включить RDP-доступ.
2. Установить нужное приложение и добавить пользователя в группу Remote Desktop Users или дать право через политику безопасности.
3. Разрешить запуск неопубликованных программ как RemoteApp: либо через групповые политики, либо через реестр:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v fAllowUnlistedRemotePrograms /t REG_DWORD /d 1
Перезагрузить компьютер.
Если хотите ограничить список доступных приложений, то создайте запись в реестре:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList\Applications\<AppName> с указанием пути, иконки и имени. Открываете стандартный RDP-клиент (
mstsc.exe) и настраиваете подключение, затем сохраняете его как файл .RDP. Открываете .RDP в текстовом редакторе и добавляете в конец:
remoteapplicationmode:i:1
RemoteApplicationName:s:Имя_окна
RemoteApplicationProgram:s:"C:\path\to\app.exe"
DisableRemoteAppCheck:i:1
PromptForCredentials:i:0
alternate shell:s:rdpinit.exe
При запуске этого файла на клиенте откроется только окно указанного приложения так, словно оно запускается локально.
Если нужно передать аргументы запуска, можно добавить строку
RemoteApplicationCmdLine:s:....Хотя RemoteApp официально поддерживается на серверах с ролью RDS, этот способ работает и на win 10/11.
При работе через RemoteApp запускается только окно приложения, рабочий стол пользователя остается недоступен. Это удобно, если нужно предоставить доступ к одной программе, не раскрывая систему целиком.
Для работы может потребоваться RDP Wrapper или другие обходы, если Windows пытается ограничить одновременные сеансы.
#windows #remoteapp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥7
rsync до сих пор остается самым простым и быстрым инструментом для резервного копирования с нескольких и более серверов. А если обернуть его в ansible, можно получить полностью автоматизированную и воспроизводимую систему бэкапов, без ручных скриптов и кронов вразнобой.Ansible будет отвечать за логику: какие хосты, какие директории, куда складывать.
rsync за быструю передачу файлов.
backup/
├── inventory
├── playbook.yml
└── vars.yml
vars.yml
backup_src: "/var/www"
backup_dest: "/backups/{{ inventory_hostname }}/"
playbook.yml
- hosts: all
become: yes
vars_files:
- vars.yml
tasks:
- name: Создать директорию для бэкапов
file:
path: "{{ backup_dest }}"
state: directory
recurse: yes
- name: Rsync данных
synchronize:
src: "{{ backup_src }}/"
dest: "{{ backup_dest }}"
archive: yes
compress: yes
delete: no
synchronize - это модуль ansible, который под капотом использует rsync.
0 3 * * * ansible-playbook /opt/backup/playbook.yml
Теперь в 03:00 ночи ansible пройдет по инвентарю и снимет инкрементальные копии со всех серверов.
единая логика бэкапов;
легко масштабировать на новые сервера;
rsync быстро переносит только измененные файлы.
#ansible #backup
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Есть в bash одна малозаметная, но крайне удобная функция, о которой знают далеко не все. Она помогает сохранить длинную команду в истории без ее выполнения. Отлично подходит для случаев, когда вы передумали запускать команду, но хотите оставить ее на потом.
Вы набираете длинную строку в консоли, но понимаете, что сейчас выполнять ее не нужно. Вместо того чтобы копировать ее куда-то в файл, используйте простую комбинацию:
Alt + Shift + 3После нажатия bash автоматически добавит символ # в начало строки. Команда будет выполнена как комментарий: фактически не запускается, потому что закомментирована, но при этом сохраняется в history вместе с #.
Открываете поиск по истории (
Ctrl + R) и просто ищете по #, нужная команда окажется первой.Маленькая фича, но иногда очень ускоряет работу.
#bash
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍4❤1
Во многих файловых системах linux есть один механизм - атрибут
immutable. Если установить его на файл или директорию, они становятся неизменяемыми: нельзя удалить, переименовать, записать, изменить права. Только root может установить и снять этот флаг.Допустим, у вас есть директория
/data/upload, куда разные сервисы записывают загружаемые файлы. Иногда часть приложений падает, начинает зацикливаться или выстреливает в ногу и создает сотни временных файлов, заполняя весь диск. Чтобы защититься от такого поведения, можно сделать директорию незаписываемой до тех пор, пока ее вручную не разблокируют администраторы.Блокируем запись:
chattr +i /data/upload
Теперь попытка записи провалится:
echo test > /data/upload/test.txt
bash: /data/upload/test.txt: Operation not permitted
Разблокируем:
chattr -i /data/upload
echo test > /data/upload/test.txt # теперь работает
Проверить наличие бита:
lsattr -a /data/upload
----i---------e------- /data/upload/.
sshd_config:
chattr +i /etc/ssh/sshd_config
Можно защитить
/etc/fstab, /boot/grub/grub.cfg или любые конфиги, которые менять должен только админ./etc/shadow полностью остановит любые попытки смены пароля:
chattr +i /etc/shadow
passwd root # не сработает
обновления системы могут ломаться, если immutable стоит на системных файлах;
для root это единственный простой пример, когда он не может удалить файл - хорошая загадка на собесах
#linux #filesystem
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
В linux часто копится мусор: временные файлы, старые логи, кэш сервисов. Многие чистят это вручную или пишут свои крон-скрипты. Но в современных дистрибутивах есть встроенный механизм -
systemd-tmpfiles. Он автоматически создает, удаляет и очищает файлы и каталоги по заданным правилам./usr/lib/tmpfiles.d/, /run/tmpfiles.d/ и /etc/tmpfiles.d/.Через них можно:
очищать каталоги по времени (30 дней, 12 часов и т.п.);
ограничивать размер директорий;
автоматически создавать нужные файлы с правами и владельцами;
удалять мусор после перезагрузки;
управлять содержимым
/tmp, /var/tmp, /var/log и любых других путей.Создадим конфиг:
/etc/tmpfiles.d/cleanup.conf
И добавим правило:
# Удалять файлы старше 14 дней
D /var/tmp/mycache 0755 root root 14d
Типы команд:
D - очистка каталога, не удаляя его самого;
d - удалить и пересоздать;
R - рекурсивная очистка.
После применения правила:
systemd-tmpfiles --clean
Можно запускать вручную или ждать автоматического выполнения таймером systemd.
/tmp. В большинстве дистрибутивов это уже настроено, но можно задать свои параметры:
d /tmp 1777 root root 7d
Файлы старше 7 дней будут удалены.
q /var/cache/nginx 500M
Тип q ограничивает каталог 500 мегабайтами, старые файлы будут удаляться первыми.
systemd-tmpfiles --verify
#linux #files
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4