Безбеден администратор на Linux: SSH сертификати, најмалку привилегии и ревизија за робусна контрола
Продукциската школка не е само далечински терминал. Таа е контролна рамнина за распоредувања, тајни, процеси и податоци. Нејзината заштита со долгорочен јавен клуч решава само еден проблем: докажување поседување на датотека што можеби била копирана пред години.
Посилен дизајн користи краткотрајни SSH сертификати за идентитет, посебна еднократна лозинка за повеќефакторска автентикација, тесно ограничени административни команди и ревизорски записи што го поврзуваат најавувањето со неговите привилегирани ефекти. Резултатот не е неранливост. Тоа е систем со ограничени акредитиви, експлицитни овластувања и доволно докази за истражување грешки или злоупотреба.
Ова упатство го гради тој систем на Ubuntu Server домаќин наречен srv01.internal. Администраторите пристапуваат до него преку доверената VPN подмрежа 10.20.0.0/24. Примерите ја користат сметката alice, UID 1101 и апликациска услуга наречена myapp.service.
Архитектура и безбедносни граници
Шифриран, офлајн Ed25519 клуч на авторитет за сертификати ги потпишува јавните клучеви на администраторите. Серверот го чува само јавниот клуч на CA и прифаќа сертификати што го содржат принципалот prod-admin. Сертификатите важат осум часа, така што вообичаениот пристап природно истекува без уредување на секој сервер.
OpenSSH потоа бара втор метод за автентикација преку PAM. Временски заснована еднократна лозинка е корисна тука бидејќи е независна од SSH клучот, иако не е отпорна на фишинг. TOTP семето исто така се наоѓа на серверот, па целосен компромис на домаќинот го поништува тој фактор. За средини со повисоко ниво на сигурност, поставете ја MFA границата на зацврстен пристапен портал или користете дизајн поддржан со безбедносен клуч.
Овластувањето останува локално. Членството во prod-admins дозволува најава, додека sudo дозволува само три точни оперативни команди. OpenSSH ја евидентира автентикацијата, Linux Audit ги бележи извршените програми, а sudo го снима терминалскиот влез и излез за привилегирани команди.
Сертификатите одговараат кој смее да се поврзе и колку долго. MFA ја зголемува цената на украдените акредитиви. Sudo одредува што смее да направи автентицираното лице. Ревизијата бележи што навистина се случило. Ниту еден од овие слоеви не заменува друг.
Предуслови и структура на проектот
Потребен ви е Ubuntu Server домаќин со конзолен или постоечки административен пристап, функционална синхронизација на времето, доверена VPN или мрежа за управување и посебна Linux работна станица за администрација. Држете ја тековната SSH сесија отворена во текот на распоредувањето. Не ја затворајте додека нова сесија не го помине секој чекор на проверка.
Завршениот домаќин ги користи следниве датотеки:
/etc/ssh/ca/user_ca.pub— доверен јавен клуч на CA/etc/ssh/auth_principals/alice— принципали на сертификат прифатени за Alice/etc/ssh/sshd_config.d/40-production-admin.conf— политика за зацврстување на SSH/etc/pam.d/sshd— наменет стек за SSH OTP автентикација/etc/sudoers.d/alice-myapp— команди со најмали привилегии/etc/audit/rules.d/50-admin-session.rules— извршни правила за ревизија/etc/systemd/journald.conf.d/40-persistent-audit.conf— ограничено трајно складирање на дневникот
На srv01.internal, инсталирајте ги потребните дистрибуциски пакети:
sudo apt update
sudo apt install openssh-server sudo auditd audispd-plugins \
libpam-google-authenticator ufw
sudo systemctl enable --now ssh
sudo systemctl enable --now auditd
timedatectl status
Исправете значително отстапување на часовникот пред да продолжите. И TOTP проверката и важноста на сертификатот зависат од времето.
Создадете и заштитете го SSH авторитетот за сертификати
Извршете го овој дел на административната работна станица, а не на серверот. Приватниот клуч на CA треба да се чува на шифрирана пренослива меморија, офлајн освен при издавање или отповикување сертификати. Неговата лозинка штити украдена копија; не штити клуч оставен монтиран на отклучена работна станица.
umask 077
sudo install -d -m 0700 /media/secure-ssh-ca
sudo chown "$(id -u):$(id -g)" /media/secure-ssh-ca
ssh-keygen -t ed25519 -a 100 \
-f /media/secure-ssh-ca/user_ca \
-C "production SSH user CA"
Запишувајте ги сериските броеви и идентитетите на сертификатите во траен регистар за издавање. Серискиот број не е таен, но им дава на истражувачите на инциденти стабилен идентификатор.
Пренесете само user_ca.pub во /root/bootstrap/user_ca.pub на серверот преку постојниот доверен административен канал. Никогаш не ја копирајте приватната датотека наречена user_ca на управуван домаќин.
Подгответе ја сметката и политиката на доверба
Назад на srv01.internal, прво потврдете дека UID 1101 не се користи. Првата команда не треба да даде излез:
getent passwd 1101
sudo addgroup --system prod-admins
sudo adduser --uid 1101 --disabled-password --gecos "" alice
sudo adduser alice prod-admins
sudo install -d -o root -g root -m 0755 /etc/ssh/ca
sudo install -d -o root -g root -m 0755 /etc/ssh/auth_principals
sudo install -o root -g root -m 0644 \
/root/bootstrap/user_ca.pub /etc/ssh/ca/user_ca.pub
Ако пребарувањето на UID врати сметка, доделете различен фиксен UID и користете го доследно во правилата за ревизија подолу.
Создадете /etc/ssh/auth_principals/alice со оваа единствена линија:
prod-admin
Поставете сопственост на root и режим 0644. Одвојувањето на принципалот на сертификатот од Unix корисничкото име му овозможува на CA да изрази улога, додека секој сервер одлучува која локална сметка смее да ја преземе.
Запишете го независниот OTP фактор
Извршете го запишувањето од доверената конзола или постоечката административна сесија:
sudo -H -u alice google-authenticator \
-t -d -f -r 3 -R 30 -w 3
sudo chown alice:alice /home/alice/.google_authenticator
sudo chmod 0400 /home/alice/.google_authenticator
Alice мора да ја зачува прикажаната тајна во својот автентикатор и да ги складира итните кодови на посебна заштитена локација. Опциите избираат временски засновани токени, повторна употреба на токени се одбива, се ограничуваат обидите и се толерира мал временски прозорец.
Пред да го промените PAM, зачувајте резервна копија во сопственост на root, соодветна за ова распоредување. Потоа направете /etc/pam.d/sshd да содржи:
auth required pam_google_authenticator.so
account required pam_nologin.so
@include common-account
session required pam_loginuid.so
@include common-session
Ова намерно го исклучува common-auth. Автентикацијата со интерактивна тастатура бара само OTP; не ги овозможува тивко повторно лозинките за сметките. Политиките за сметка и сесија сè уште ги користат стандардните PAM стекови на Ubuntu.
Барајте сертификати и MFA во OpenSSH
Создадете /etc/ssh/sshd_config.d/40-production-admin.conf како root:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication yes
PubkeyAuthentication yes
UsePAM yes
TrustedUserCAKeys /etc/ssh/ca/user_ca.pub
AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
AuthenticationMethods publickey,keyboard-interactive:pam
AllowGroups prod-admins
DisableForwarding yes
PermitTunnel no
X11Forwarding no
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2
MaxStartups 10:30:30
ClientAliveInterval 300
ClientAliveCountMax 2
LogLevel VERBOSE
DisableForwarding ги затвора патеките за препраќање на агент, TCP, Unix-приклучок и X11. Тоа е пожелно за административна школка, но несоодветно ако овој домаќин намерно се користи како bastion или крајна точка за тунел. Во тој случај, изложете само потребната можност за препраќање и одделно ограничете ги одредиштата.
Проверете ги и синтаксата и ефективната политика пред повторното вчитување:
sudo sshd -t
sudo sshd -T -C user=alice,host=srv01.internal,addr=10.20.0.10 \
| grep -E 'authenticationmethods|trustedusercakeys|authorizedprincipalsfile|disableforwarding'
sudo systemctl reload ssh
sudo systemctl is-active ssh
Неуспешното sshd -t е услов за запирање. Поправете ја пријавената датотека и линија; не вчитувајте повторно експериментално.
Издадете краткотраен администраторски сертификат
На работната станица на Alice, создадете наменски приватен клуч:
umask 077
ssh-keygen -t ed25519 -a 100 \
-f "$HOME/.ssh/id_ed25519_prod" \
-C "alice production access"
Преместете само id_ed25519_prod.pub на офлајн работната станица за потпишување. Откако ќе ги проверите барателот и отпечатокот од клучот преку процесот за запишување на вашата организација, монтирајте го CA и потпишете го:
CERT_SERIAL=10001
ssh-keygen -s /media/secure-ssh-ca/user_ca \
-I "alice-$(date -u +%Y%m%dT%H%M%SZ)" \
-z "$CERT_SERIAL" \
-n prod-admin \
-V -5m:+8h \
-O clear \
-O permit-pty \
id_ed25519_prod.pub
ssh-keygen -Lf id_ed25519_prod-cert.pub
Дозволата од пет минути наназад апсорбира мали разлики во часовникот. -O clear ги отстранува стандардните дозволи на сертификатот, по што се обновува само доделувањето терминал. Ограничувањата за препраќање на серверската страна остануваат авторитативни.
Вратете го id_ed25519_prod-cert.pub на Alice како ~/.ssh/id_ed25519_prod-cert.pub. Приватниот клуч никогаш не ја напушта нејзината работна станица.
Применете најмали привилегии со sudo што може да се ревидира
Сметката на Alice нема лозинка, па неограниченото sudo ниту е корисно ниту е наменето. Создадете /etc/sudoers.d/alice-myapp со точни команди:
Defaults:alice use_pty,log_input,log_output
Defaults:alice iolog_dir="/var/log/sudo-io"
alice ALL=(root) NOPASSWD: /usr/bin/systemctl reload myapp.service
alice ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp.service
alice ALL=(root) NOPASSWD: /usr/bin/journalctl --unit=myapp.service --since=-30min --no-pager
Поставете режим 0440, потоа извршете sudo visudo -cf /etc/sudoers.d/alice-myapp. Совпаѓањето на аргументите е точно: промена на единицата, редоследот на опциите или временскиот опсег се одбива. Избегнувајте да давате интерпретатори, уредувачи, школки, неограничен journalctl или широко параметризирани команди за услуги; тие често стануваат индиректни root школки.
Sudo I/O дневниците може да содржат чувствителен излез од апликацијата или внесен текст. Ограничете го пристапот на root, дефинирајте задржување и никогаш не барајте од операторите да внесуваат продукциски тајни во снимани терминалски програми.
Изградете ја ревизорската трага
Создадете /etc/audit/rules.d/50-admin-session.rules:
-a always,exit -F arch=b64 -S execve -F auid=1101 -k admin-exec
-a always,exit -F arch=b32 -S execve -F auid=1101 -k admin-exec
Вчитајте ги и прегледајте ги правилата:
sudo augenrules --load
sudo auditctl -l
sudo auditctl -s
sudo ausearch -k admin-exec -i
UID за најава, или auid, ја следи Alice низ sudo, поврзувајќи ги привилегираните процеси со изворната најава. Audit ги снима повиците и аргументите на execve, но не и вградените команди на школката, терминалскиот излез или секоја измена на датотека. Sudo I/O евидентирањето пополнува дел од тој јаз за привилегирани команди.
За трајни SSH и услужни дневници, создадете /etc/systemd/journald.conf.d/40-persistent-audit.conf:
[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=1G
MaxRetentionSec=30day
Создадете /var/log/journal со sudo systemd-tmpfiles --create --prefix /var/log/journal, потоа рестартирајте го systemd-journald. Локалните дневници помагаат во работењето, но напаѓач што ќе добие root може да ги измени. Продукциските распоредувања треба да ги препраќаат SSH, sudo и ревизорските настани до посебно администриран собирач.
Заштитен ѕид и фазно распоредување
Потврдете дека 10.20.0.0/24 навистина е VPN подмрежата за ова распоредување. Потоа поставете го правилото на заштитниот ѕид:
sudo ufw allow from 10.20.0.0/24 to any port 22 proto tcp
sudo ufw status numbered
Ако UFW не е веќе активен, овозможете го само од конзолен пристап откако ќе ја земете предвид секоја друга потребна услуга. Овозможувањето заштитен ѕид со стандардно одбивање оддалеку без целосни правила може да ги прекине и SSH и апликацијата.
Прво воведете го на еден canary домаќин. Држете ја bootstrap сесијата отворена, автентицирајте се преку VPN во втор терминал, користете sudo, прегледајте ги сите три ревизорски слоеви и дури потоа повторете ја конфигурацијата преку верзионирана автоматизација.
Тестирајте автентикација, овластување и докази
Од работната станица на Alice:
ssh -o IdentitiesOnly=yes \
-i "$HOME/.ssh/id_ed25519_prod" \
[email protected]
sudo -l
sudo /usr/bin/systemctl reload myapp.service
sudo /usr/bin/journalctl --unit=myapp.service --since=-30min --no-pager
sudo /bin/bash
Врската мора да бара и приватен клуч и OTP. Првите три sudo команди треба да успеат каде што е применливо; школката мора да биде одбиена. Тестирајте и негативни патеки: изоставете го сертификатот, внесете неважечки OTP, поврзете се надвор од VPN и користете сертификат со погрешен принципал. Секој случај треба да не успее со затворен пристап.
Од задржаната административна сесија, поврзете ги добиените записи:
sudo journalctl -u ssh --since "15 minutes ago"
sudo ausearch -k admin-exec -ua 1101 -i
sudo sudoreplay -l user alice
sudo ls -l /var/log/sudo-io
Вообичаени неуспеси и оперативни компромиси
- Сертификатот е одбиен: споредете го излезот од
ssh-keygen -Lfсо принципалот прифатен од серверот, прозорецот на важност и отпечатокот од доверениот CA. - Нема OTP потсетник: потврдете дека клиентот навистина го понудил сертификатот и дека
AuthenticationMethodsсе појавува во ефективниот излез одsshd -T. - Секој OTP не успева: проверете ја синхронизацијата на времето и сопственоста и дозволите на
.google_authenticator. - Sudo командата е одбиена: споредете ги патеката на извршната датотека и целосната низа аргументи со
sudo -l. Точното совпаѓање е намерно. - Недостигаат ревизорски настани: проверете ги UID на Alice, вчитаните правила за ревизија и статусот на ревизорскиот демон. Постоечките сесии го задржуваат својот изворен UID за најава.
- Преголем обем на дневници: држете ги правилата за ревизија ограничени на административни идентитети, следете го користењето на дискот и наметнете задржување. Снимањето
execveна ниво на целиот систем може да биде скапо на оптоварени домаќини.
Кратките сертификати ја намалуваат изложеноста, но воведуваат зависност за достапност од процесот на издавање. Чувајте го CA офлајн, документирајте постапка за итно издавање и одржувајте упатства за отповикување за инциденти што не можат да чекаат истекување. Тестирајте ги артефактите за отповикување на canary: нечитлива датотека конфигурирана преку RevokedKeys може широко да предизвика неуспех на автентикацијата со јавен клуч.
Конечна листа за проверка
- Приватниот клуч на CA постои само на шифриран офлајн медиум.
- Серверот му верува само на јавниот клуч на CA и на наменетиот принципал.
- Сертификатите имаат единствени идентитети, запишани сериски броеви и кратка важност.
- Најавата како root, лозинките и непотребното препраќање се оневозможени.
- SSH бара и важечки сертификат и OTP.
- Само VPN подмрежата може да достигне порта 22.
- Sudo доделува точни оперативни команди наместо општа школка.
- SSH записи во дневникот, ревизорски настани и sudo репродукции може да се преземат.
- Задржувањето и препраќањето надвор од домаќинот одговараат на чувствителноста на снимените податоци.
- Позитивните и негативните тестови поминуваат пред да се затвори bootstrap сесијата.
Стабилната далечинска администрација произлегува од тоа овластувањето да биде привремено, тесно и видливо. Копираниот клуч треба брзо да истече. Украден фактор не треба да биде доволен. Рутинско распоредување не треба да подразбира root школка. А кога нешто ќе тргне наопаку, доказите треба да ја опишат патеката од идентитет до дејство. Тоа е разликата меѓу само дозволување SSH и управување со одбранлива продукциска контролна рамнина.