Root jogú fájlkezelés két szerver között Midnight Commanderrel
Gyakori adminisztrációs feladat, hogy két távoli szerver között kell fájlokat mozgatnunk. Amíg ezek a felhasználónk tulajdonában vannak, a Midnight Commander (MC) beépített Shell-link vagy SFTP funkciója tökéletesen teszi a dolgát. A probléma akkor kezdődik, ha olyan rendszerfájlokhoz kell nyúlnunk, amelyek a root tulajdonában vannak.
A korlátok
Bár az MC-t elindíthatjuk sudo mc-ként az egyik szerveren, ettől még másik szerveren (VFS rétegen keresztül) továbbra is csak a bejelentkezett felhasználó jogaival fogunk rendelkezni. Mivel a biztonsági ajánlások tiltják a közvetlen root SSH-bejelentkezést, patthelyzet alakul ki: nem tudjuk írni a távoli konfigokat, hiába van sudo jogunk mindkét gépen.
A megoldás: SSHFS és emelt szintű SFTP alrendszer
A megoldás lényege, hogy a távoli fájlrendszert SSHFS segítségével csatoljuk fel a helyi gépünkre, de úgy instruáljuk a protokollt, hogy a távoli oldalon az SFTP-kiszolgálót már eleve sudo-val futtassa.
1. Távoli oldal előkészítése
Ahhoz, hogy az SSHFS jelszókérés nélkül tudja emelni a jogosultságot, módosítanunk kell a távoli gépeken a sudoers fájlt. Hozzunk létre egy új fájlt a /etc/sudoers.d/ könyvtárban:
Bash
# Visudo használata erősen ajánlott, minden sudo jog szerkesztésnél
# sudo visudo -f /etc/sudoers.d/sshfs-root
felhasznalonev ALL=(root) NOPASSWD: /usr/lib/openssh/sftp-server
2. Kézi csatlakoztatás
A csatolás során az -o sftp_server kapcsolóval adjuk meg a módosított indítóparancsot:
Bash
mkdir -p ~/mnt/srv1
sshfs user@szerver1:/ ~/mnt/srv1 -o sftp_server="sudo /usr/lib/openssh/sftp-server" -o reconnect,ServerAliveInterval=15
Automatizálás szkripttel
Ha gyakran dolgozunk a két gép között, érdemes egy kis bash szkriptet írni, ami elvégzi a felcsatolást, megnyitja az MC-t a két megfelelő könyvtárban, majd kilépéskor lecsatolja a meghajtókat.
Bash
#!/usr/bin/env bash
set -euo pipefail
# Elérési utak definiálása
SRV1_MNT="$HOME/mnt/srv1"
SRV2_MNT="$HOME/mnt/srv2"
mkdir -p "$SRV1_MNT" "$SRV2_MNT"
# Csatlakoztatás, ha még nincsenek felcsatolva
mountpoint -q "$SRV1_MNT" || sshfs user@szerver1:/ "$SRV1_MNT" \
-o sftp_server="sudo /usr/lib/openssh/sftp-server" \
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
mountpoint -q "$SRV2_MNT" || sshfs user@szerver2:/ "$SRV2_MNT" \
-o sftp_server="sudo /usr/lib/openssh/sftp-server" \
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
# MC indítása a két panelen a két távoli eléréssel
mc "$SRV1_MNT" "$SRV2_MNT"
# Kilépés után takarítás (leválasztás)
fusermount -u "$SRV1_MNT" 2>/dev/null || true
fusermount -u "$SRV2_MNT" 2>/dev/null || true
Megfontolni valók
- Hálózati forgalom: Ne felejtsük el, hogy az SSHFS transzparens módon működik. Ha a Szerver1-ről másolunk a Szerver2-re, az adatmennyiség először lejön a mi gépünkre, majd onnan megy fel a másik szerverre. Kisebb konfig fájloknál ez elhanyagolható, de több gigabájtos állományoknál használjunk inkább
rsync-et. - Biztonság: A
NOPASSWDbeállítása biztonsági kockázatot jelenthet, ha a felhasználói fiókunk kompromittálódik. Csak olyan gépeken alkalmazzuk, ahol ez a kockázat kezelhető, vagy feladatunk végeztével vegyük vissza ezta jogosultságot. - Stabilitás: A
reconnectésServerAliveIntervalopciók segítenek életben tartani a kapcsolatot instabilabb hálózat esetén is, megelőzve az MC lefagyását.
Ezzel a módszerrel végre visszakapjuk a jól megszokott kétpaneles kényelmet, anélkül, hogy a jogosultságokkal kellene bűvészkednünk a parancssorban.