Hogyan futtatható egy adott program root-ként jelszó nélkül?

Valamit sudo-ként kell futtatnom jelszó nélkül, ezért a visudo fájlt használtam, és hozzáadtam ezt a sudoers fájl:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program 

Akkor kipróbáltam:

$ sudo /path/to/my/program [sudo] password for MYUSERNAME: 

Miért kér jelszót? Hogyan futtathatom / használhatom a parancsokat root felhasználóként egy nem root felhasználóval, jelszó kérése nélkül?

Válasz

Ön van egy másik bejegyzés a sudoers fájlban, amely általában a /etc/sudoers címen található , amely egyezik a felhasználóval is. A NOPASSWD szabálynak ennek utána kell lennie annak érdekében, hogy elsőbbséget élvezhessen.

Ezt követően sudo rendszerint minden parancshoz jelszót kér, kivéve a /path/to/my/program parancsot, amelyet mindig a jelszó megadása nélkül futtat.

Megjegyzések

  • működne ez akkor is, ha a /path/to/my/program python parancsfájl lenne?
  • Tudja-e a program ehelyett álnév legyen, állítsa be a bash-ra (azaz a .bashrc mezőben)? Vagy akár egy shell parancsfájl az /usr/local/sbin belül? Kipróbálni.
  • Nikos – nem, ez nem lehet álnév. Valódi útra kell mutatnia.
  • sudoerek? hol van? nagyon nehéz használni a válaszát (
  • @VasiliiSuricov: Ez ‘ általában /etc, de egyes rendszerek máshol. Ha ‘ nem találja, próbálja meg a man sudoers elemet. Az adott fájl helyi helyét a man oldal abban az időben, amikor sudo az adott rendszerhez készült.

Válasz

Ha a /etc/sudoers csoportban több egyező bejegyzés van, a sudo használja az utolsót. Ezért, ha bármilyen parancsot jelszó-parancssorral hajthat végre, és azt szeretné, hogy egy adott parancsot jelszó kérése nélkül hajthasson végre, utoljára szüksége van a kivételre.

myusername ALL = (ALL) ALL myusername ALL = (root) NOPASSWD: /path/to/my/program 

Vegye figyelembe a , lehetővé téve a program futtatását root felhasználóként, de más felhasználóként nem. (Ne adjon meg több engedélyt, mint a szükséges minimum, hacsak nem gondolta ki a következményeket.)

Megjegyzés az újrához olyan hirdetők, akik nem futtatják az Ubuntut, vagy akik megváltoztatták az alapértelmezett sudo konfigurációt (az Ubuntu s sudo alapértelmezés szerint rendben van) : A megemelt jogosultsággal rendelkező shell szkriptek futtatása kockázatos, tiszta környezetből kell indulnia (amint a A shell elindult, túl késő (lásd: Setuid engedélyezése a shell szkripteken ), ezért a sudo-ra van szükség. Győződjön meg róla, hogy Defaults env_reset van a /etc/sudoers mezőben, vagy hogy ez az opció a fordítási idő alapértelmezett értéke (sudo sudo -V | grep env tartalmaznia kell Reset the environment to a default set of variables).

Megjegyzések

  • ex a jhon és a sudo gyökérkezeléséhez su no no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Ha tetszőleges parancsokat szeretne engedélyezni, gyökér, állítsd be ezt john ALL=(ALL) NOPASSWD: all. ‘ nincs értelme átmenni su.
  • Kérdés: Módosítsam-e a parancsfájlom engedélyeit hogy csak a root felhasználók módosíthassák és olvashassák a biztonság kedvéért?

Egy olyan támadóra gondolok, aki módosítja a szkriptet, amelynek minden engedélye meg van adva jelszó nélkül, hogy azt tegye, amit akar. Nyilvánvaló, hogy a támadó ‘ még sudoers fájlt sem tud olvasni, hogy megtudja, melyik szkript rendelkezik ezzel a kiváltsággal, de akkor is megpróbálhatja az összes egyéni szkriptemet, amint megtalálja a mappát, amelyben vannak Remélem, hogy egyesek megengedettek, vagy ilyesmi.

  • @JeffreyLebowski Ha van egy sudo szabálya, amely a parancsfájlt futtatja (közvetlenül vagy közvetve), akkor ‘ Fontos, hogy csak a root (vagy amúgy root jogosultsággal rendelkező személyek) írhassanak a szkriptfájlba, a szkriptfájlt tartalmazó könyvtárba és annak szülőkönyvtárába stb. Nem számít, hogy ‘ mindegy, hogy bárki el tudja olvasni a szkriptfájlt (hacsak nem tartalmaz jelszót vagy valamit, de ‘ rossz ötlet, ha van ‘ sa jelszó, akkor annak a saját fájljában kell lennie, különben ‘ túl nagy a veszélye annak, hogy véletlenül kiszivárogtatja, pl. beillesztette a kódnak ezt a részét egy kérdésre ezen a webhelyen).
  • @alper Nem. Nagyon kevés dolog szükséges újraindítani. A (z) sudoers megváltoztatása után nem kell ‘ semmit sem tennie: sudo ellenőrzi minden alkalommal.
  • Válasz

    FIGYELEM : Ezt a választ bizonytalannak ítélték meg. Lásd az alábbi megjegyzéseket

    Teljes megoldás: A következő lépések segítenek elérni a kívánt kimenetet:

    1. Hozzon létre egy új szkriptfájlt (cserélje le a create_dir.sh parancsot a kívánt parancsfájl nevére):

      vim ~/create_dir.sh 

      A szkript a felhasználó saját könyvtárában jön létre.

    2. Adjon hozzá néhány parancsot, amelyek csak egy root vagy sudo felhasználó úgy hajthat végre, mint egy mappát a gyökérkönyvtár szintjén:

      mkdir /abc 

      Megjegyzés: Ne adjon sudo ezekhez a parancsokhoz. Mentés és kilépés (az :wq! használatával)

    3. Végrehajtási engedélyeket rendelhet hozzá:

      sudo chmod u+x create_dir.sh 
    4. Hajtson végre módosításokat, hogy a szkript ne igényeljen jelszót.

      1. Nyissa meg a sudoers fájl:

        sudo visudo -f /etc/sudoers 
      2. Adja hozzá a következő sort a végén:

        ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh 

        Cserélje le a ahmad szót bármilyen felhasználónévvel. Ügyeljen arra is, hogy ez legyen az utolsó sor. Mentés és kilépés.

    5. Most a parancs futtatásakor add sudo előtte, például:

      sudo ./create_dir.sh 

      Ez a parancsfájl belsejében lévő parancsokat jelszó kérése nélkül futtatja.

    Kövesse az egyszerű itt említett lépések http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

    Megjegyzések

    • Jobb lenne, ha itt megadná a megfelelő lépéseket, és a linket biztonsági másolatként használná a részletesebb információkhoz. Így a válasz akkor is megőrzi a lehetséges értéket, ha ez a link már nem érvényes.
    • Ez a tanács nem biztonságos. A sudo chmod u+x create_dir.sh sudo része felesleges, mivel a felhasználónak (feltehetően) tulajdonjoga van az otthoni dir. Mivel a felhasználó írhat az create_dir.sh címre, Ön tulajdonképpen egy ingyenes gyökérhéjat adott az adott felhasználónak.
    • @Lekensteyn Ez azt is jelenti, hogy minden felhasználóként futó program . Lehetséges, hogy a felhasználó csak bármit futtathat a sudo-val jelszó nélkül.
    • Hiányzik valami? Úgy gondolom, hogy a teljes chmod felesleges, mivel a sudo -re támaszkodik a jogosultságainak emeléséhez.

    Válasz

    Szerintem a szintaxisa téves. Legalább a következőket használom, amelyek nekem működnek:

    myusername ALL=(ALL) NOPASSWD: /path/to/executable 

    Megjegyzések

    • A (ALL) rész opcionális, elhagyása pontosan ugyanolyan hatást fejt ki. A (root) birtoklása ugyan jobb lenne, de hiánya nem magyarázza meg a problémát. Id id “” 1484a13e0a “>

    erre a parancsra és semmi másra! Nincs ok a teljes rendszer megbontására …

  • @Johan: Ez már benne volt a kérdésben.
  • Válasz

    Ha el akarja kerülni a sudo használatát, és nem kell módosítania a sudoers konfigurációs fájlt sem, használhatja:

    sudo chown root:root path/to/command/COMMAND_NAME sudo chmod 4775 path/to/command/COMMAND_NAME 

    Ezt a parancsot rootként fogja futtatni, sudo nélkül.

    Kommentárok

    • Hú, még soha nem hallottam erről a megoldásról, gondolkodj el
    • @RyanNerd: Ez nem biztonságos megoldás. Az OP nemcsak futtathatja a parancsot root néven jelszó nélkül, hanem bárki, aki futtathatja a parancsot root felhasználóként.
    • ” chmod 4775 fájlnév ” egy út. Másodszor, talán a SETUID jobb módja a teljes fájlengedélyek újradefiniálása nélkül a ” chmod u + s fájlnév ”
    • a sudo chmod 005 biztonságos. Nem akarsz ‘ írni engedélyeket az aktuális felhasználónak. Ellenkező esetben bárki a munkamenetében bármit megtehetne a szkripteddel.

    Válasz

    Ha van olyan disztró, mint a Manjaro , először egy olyan fájllal kell foglalkoznia, amely felülírja az / etc / sudoers definícióját, törölheti, vagy közvetlenül együttműködhet azzal a fájllal az új konfigurációk hozzáadásához.

    Ez a fájl:

    sudo cat /etc/sudoers.d/10-installer 

    A megtekintés CSAK gyökérjogosultsággal történik, nélküle nem lehet felsorolni ezt a könyvtárat, ez a fájl Manjaro-specifikus, más névvel is megtalálhatja ezt a konfigurációt , de ugyanabban a könyvtárban.

    A választott fájlban felveheti a következő sorokat a kívánt konfiguráció (k) megszerzéséhez:

    A csoport hitelesítésének figyelmen kívül hagyása

    %group ALL=(ALL) NOPASSWD: ALL 

    vagy a felhasználó hitelesítésének figyelmen kívül hagyása

    youruser ALL=(ALL) NOPASSWD: ALL 

    vagy egy futtatható fájl hitelesítésének figyelmen kívül hagyása

    youruser ALL=(ALL) NOPASSWD: /path/to/executable 

    GYORS MEGJEGYZÉS: Kinyitja a kaput a SUDO használatára hitelesítés nélkül, ami azt jelenti, hogy futtathatja mindent, ami mindent módosít a rendszeréből, használja felelősséggel.

    Válasz

    Ellenőrizze, hogy a sudo nem álneves-e. Fuss így:

    /usr/bin/sudo /path/to/my/program 

    Például egy ehhez hasonló shell alias:

    alias sudo="sudo env PATH=$PATH" 

    okozhatja ezt a viselkedést.

    Megjegyzések

    • Igazad van, a kommentem nem volt rendben itt , elnézést ezért . Mindazonáltal én ‘ érdekelt vagyok – hogyan számíthat arra, hogy az álnév megváltoztatja a sudo sudoers feldolgozását. Vagy arról beszél, hogy átirányítja a sudo t olyasmire, amely mindig kinyomtatja ezt a hibaüzenetet a jelszavak lekereséséhez? Itt nem valószínű, hogy ez a helyzet …
    • Ugyanaz a problémám volt, mint az OP-val. Kiderült, hogy azt az okozza, hogy alias sudo="sudo env PATH=$PATH" van a ~/.bashrc könyvtárban. Ahelyett, hogy csak magamnak megoldanám és vakon folytatnám az üzletemet, válaszomat elküldtem lehetséges megoldásként bárki más számára, aki ezen a szálon jár.
    • Ez ‘ s rendben van, de ha ez nem nyilvánvaló (ami ebben az esetben nem ‘ t legalább néhány ember számára), akkor jó, ha magyarázatot ad a válaszra, hogy valamilyen kontextust adjon és megakadályozza, hogy az emberek vakon használják a varázsigéket. +2 (- (- 1) + +1). 🙂

    Válasz

    A szkript futtatásakor .

    Szerkesztés: Egy másik válaszra adott megjegyzésed alapján ezt egy ikonról futtatod. Létre kell hoznia egy .desktop fájlt, amely sudo-val hajtja végre a programot, csakúgy, mint a terminálon.

    Fontolja meg a egy vizuális jelszó kéréshez.

    Valószínűleg fontolóra kell vennie azt az elképzelést, hogy a dolgokat nem szabad rootként futtatnia, és hogy a rendszert az úton tovább kell változtatni, hogy ne tegye a következőket: a root engedélyekre van szükségük, az jobb út lenne.

    Megjegyzések

    • Ne készítsen setuidot a shell parancsfájlokról . Lásd: A setuid engedélyezése a shell szkripteken .
    • Úgy gondoltam, hogy nem is említettem, mert ‘ olyan rossz lehetőség. Csak azért töröltem, mert ‘ aggódtam, hogy ez a kérdező még a figyelmeztetéssel együtt is felhasználhatja a tanácsot!

    Válasz

    Ez megoldotta a problémát számomra (kipróbáltam néhány más választ is, amelyek segíthettek):

    A szkript, amelyet hívtam a /usr/bin könyvtárban volt, ahová nem rendelkezem írási engedéllyel (bár általában minden fájlt el tudok olvasni ott). A szkript chmodded + x volt (futtatható engedély), de még mindig nem működött. Ezt a fájlt áthelyezve a saját könyvtáramban található útvonalra a /usr/bin helyett végül sudo-val hívhattam meg jelszó megadása nélkül.

    Valamit én is kételkedett (tisztázás a jövőbeli olvasók számára): Sudo-ként kell futtatnia a szkriptet. Írja be a sudo parancsot, amikor meghívja a szkriptet. Ne használja a sudo parancsot a parancsfájl belsejében, amelynek valójában root-ra van szüksége (esetemben a billentyűzet háttérvilágításának megváltoztatása). Talán ez is működik, de nem kell, és ez jobb megoldásnak tűnik.

    Megjegyzések

    • A második bekezdés megválaszolta a problémámat
    • @MuhammadAhmadZafar Glad segített!
    • A sudo használata egy szkript belsejében teljesen rendben van, feltéve, hogy rendelkezik a megfelelő jogokkal (a sudoers) a kérdéses parancs jelszó nélküli futtatásához. Kicsit biztonságosabbá teszi a dolgokat.
    • valóban használhatná ezt az újra átírt választ lépésről-lépésre ‘ így csinálod ‘, nem pedig a többi válasz párbeszédeként
    • @WalrustheCat Jó pont. Újraolvasva válaszomat, azt hiszem, magam is kissé összezavarodhattam. Most azonban nem emlékszem ‘ arra, hogy mi volt a pontos helyzet, így ‘ nem tudok jobban írni. Ha kitalálja, talán több válasz kombinációja, mindenképpen küldjön új választ!

    Válasz

    Egy másik lehetőség lehet a super parancs a parancsfájl futtatásához

    super /path/to/your/script 

    Ha bináris futtatni akar futtatható (pl. ELF bináris fájlba fordította valamilyen C forráskódból) – ami nem egy szkript – mint root, akkor fontolóra veheti setuid (és valójában /bin/login, /usr/bin/sudo és /bin/su és super mind ezt a technikát használják). Legyen azonban nagyon óvatos, hatalmas biztonsági lyukat nyithat meg .

    Konkrétan a programjának paranoiásan kódoltnak kell lennie (tehát ellenőrizze az összes argumentumot, valamint a környezetet és a külső körülményeket, mielőtt ” ” előtt cselekszik, feltételezve, hogy potenciálisan ellenséges felhasználót használ), akkor gondosan használhatja a seteuid (2) és barátait (lásd még: setreuid (2) ) ( lásd még: képességek (7) & hitelesítő adatok (7) & execve (2) …)

    Te ” az ilyen bináris fájl telepítésekor használja a chmod u+s (olvassa el a chmod (1) leírást).

    De legyen nagyon óvatos .

    Sok mindent olvashat a setuid ról, beleértve a Haladó Linu x Programozás , mielőtt kódolna egy ilyen dolgot.

    Vegye figyelembe, hogy egy szkript vagy bármely shebang -ed dolog, nem lehet setuid. De kódolhat (C-ben) egy kis setuid-bináris csomagolást.

    Ne feledje, hogy Linux rendszeren az alkalmazáskód kölcsönhatásba lép a Linux kernellel a rendszerhívások használatával (2) . Legtöbbjük kudarcot vallhat, lásd: errno (3) . Sok Linux-alkalmazás (pl. GNU bash , GNU make , GNU gdb , GNOME ) nyílt forráskódúak: letöltheti, tanulmányozhatja és hozzájárulhat forráskódjukhoz.

    Megjegyzések

    • A fejlett Linux-programozás halott láncszem.

    Válasz

    Ideális esetben, ha testreszabja, milyen parancsokat lehet futtatni a sudo keresztül, ezeket a módosításokat külön fájlban kell végrehajtania a /etc/sudoers.d/ a sudoers fájl közvetlen szerkesztése helyett. A fájl (ok) szerkesztéséhez mindig a visudo parancsot is használja. Soha ne adjon NOPASSWD ALL parancsokat.

    Példa: sudo visudo -f /etc/sudoers.d/mynotriskycommand

    Helyezze be az engedély megadásához szükséges sort: myuser ALL= NOPASSWD: /path/to/your/program

    Ezután mentse el és lépjen ki, és visudo figyelmeztet, ha valamilyen szintaxis hibája van.

    A sudo -l futtatásával megtekintheti a felhasználó számára megadott engedélyeket, ha valamelyik felhasználóspecifikus A NOPASSWD parancsok a kimenetben lévő %groupyouarein ALL=(ALL) ALL parancsok ELŐTT jelennek meg, és a rendszer kéri a jelszavát.

    Ha megtalálja maga készít sok ilyen sudoers.d fájlt, akkor valószínűleg felhasználónként szeretné létrehozni őket, hogy könnyebben megjeleníthessék őket. Ne feledje, hogy a FÁJL NÉVEK és a SZABÁLYOK sorrendje a fájlban nagyon fontos, az UTOLSÓ betöltött nyer, függetlenül attól, hogy TÖBB, vagy KEVESEBB megengedő, mint az előző bejegyzések.

    A fájlnév sorrendjét a 00-99 vagy aa / bb / cc előtag használatával vezérelheti, bár ne feledje, hogy ha BÁRMILYEN fájlja van, amelyeknek nincs numerikus előtagja, akkor azok a számozott fájlok után töltődik be, felülbírálva a beállításokat. Ennek oka, hogy a nyelvi beállításoktól függően a “lexikai rendezés” a héj először számsorozatot használ, majd a növekvő sorrendben rendezve nagy és kisbetűket is beilleszthet.

    Próbálkozzon a printf "%s\n" {{0..99},{A-Z},{a-z}} | sort és printf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sort futtatásával, hogy lássa, a jelenlegi nyelv nyomtat-e AaBbCc stb. vagy ABC majd abc, hogy meghatározza, hogy mi lenne a legjobb “utolsó” betű előtag légy.

    Válasz

    Annak érdekében, hogy bármely felhasználó engedélyezhesse a program sudo formában történő végrehajtását jelszó megadása nélkül, hozzáadhatja a következő sort:

    %sudo ALL=(root) NOPASSWD: /path/to/your/program

    /etc/sudoers

    Ne feledje, hogy % sudo elkészíti.

    Megjegyzések

    • Bár ez a ‘ egy módja a sudo-szabály végrehajtásának, nem ‘ t ne válaszoljon arra a kérdésre, hogy a NOPASSWD zászló ennek a szabálynak a beállítása miért eredményezett továbbra is jelszó kérést. Nézze meg az elfogadott választ arról, hogy miért történt.

    Válasz

    A következők arra az esetre vonatkoznak, amikor parancsot csak akkor kell futtatni jelszó nélkül, ha annak van egy meghatározott opciókészlete, ahol az opciók egy része változó . AFAIK nem lehet változót vagy értéktartományt használni a sudoers deklarációkban, azaz kifejezetten engedélyezheti a command option1 hozzáférést, de command option2 nem:

    user_name ALL=(root) /usr/bin/command option1

    de ha a struktúra command option1 value1, akkor ahol változhat, a value1 minden lehetséges értékéhez kifejezett sudoers sorok szükségesek. A Shell szkript lehetővé teszi a megkerülését.

    Ezt a választ M. Ahmad Zafar válasza ihlette, és ott megoldotta a biztonsági problémát.

    1. Hozzon létre egy shell szkriptet, ahol hívja meg a parancsot sudo nélkül.
    2. Mentse a szkriptet egy root által privilegizált mappába (pl. /usr/local/bin/), a fájl gyökér tulajdonosa (pl. chown root:wheel /usr/local/bin/script_name), másoknak nincs írási hozzáférése (pl. chmod 755 /usr/local/bin/script_name).
    3. Adja hozzá a kivételt a sudoerekhez a visudo használatával:

      user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

    4. Futtassa a szkriptet sudo script_name.

    Például meg akarom változtatni a kijelző alvási időkorlátját a macOS-on. Ez a következővel érhető el:

    sudo pmset displaysleep time_in_minutes

    Az alvási időkorlát megváltoztatását egy ártatlan műveletnek tartom, amely nem “indokolja a jelszó begépelésével járó problémákat”, de A div> sok mindent megtehet, és ezeket a dolgokat szeretném a sudo jelszó mögött tartani.

    Tehát a következő szkript a /usr/local/bin/ds címen:

     #!/bin/bash if [ $# -eq 0 ]; then echo "To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"" else if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then pmset displaysleep $1 else echo "Time must be 0..180, where 0 = never, 1..180 = number of minutes" fi fi  

    A sudoers fájl végén a következő sor áll rendelkezésemre:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

    Az időtúllépés 3 percre állításához futtatom a szkriptemet a szokásos felhasználói fiókból: user_name:

    sudo ds 3

    PS A szkriptem nagy része bemeneti ellenőrzés, amely nem kötelező, így a következők is működnek:

     #!/bin/bash pmset displaysleep $1  

    Válasz

    Alternatívaként használhatja a python pudo csomag.

    Telepítés:

    user$ sudo -H pip3 install pudo # you can install using pip2 also 

    Az alábbiakban látható a kódrészlet, amelyet a python automatizálásában használhat a parancsok futtatásához root jogosultsággal:

    user$ python3 # or python2 >>> import pudo >>> (ret, out) = pudo.run(("ls", "/root")) # or pudo.run("ls /root") >>> print(ret) >>> 0 >>> print(out) >>> b"Desktop\nDownloads\nPictures\nMusic\n" 

    Az alábbiakban bemutatjuk a parancsok futtatásának root jogosultsággal rendelkező cmd-példáját:

    user$ pudo ls /root Desktop Downloads Pictures Music 

    válasz

    A sudoers szkriptben, amely az / etc / belül kommentálja az alábbi sort:

    #includedir /etc/sudoers.d

    Hozzon létre egy fájlt bármilyen névvel az /etc/sudoers.d/ könyvtárban, és adja hozzá a tartalmat a maximális válaszok szerint. Mint minden felhasználó számára, mint root

    #!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

    Ez a legbiztonságosabb módszer a parancsfájl futtatására root jogosultsággal.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük