GNU/Linux >> Znalost Linux >  >> Linux

Může program zjistit, že je spuštěn pod sudo?

Řešení 1:

Ano, když program běží pod sudo, jsou nastaveny 4 proměnné prostředí:

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20

Všimněte si, že je lze zfalšovat jednoduchým nastavením. Nevěřte jim v ničem kritickém.

Například:V tomto programu potřebujeme říct uživateli, aby spustil nějaký jiný program. Pokud byl aktuální spuštěn pomocí sudo, druhý bude také.

#!/bin/bash

echo 'Thank you for running me.'

if [[ $(id -u) == 0 ]]; then
  if [[ -z "$SUDO_COMMAND" ]]; then
    echo 'Please now run: next_command'
  else
    echo 'Please now run: sudo next_command'
  fi
else  echo 'Error: Sadly you need to run me as root.'
  exit 1
fi

Všimněte si, že testuje pouze proměnnou SUDO_*, pokud může nejprve prokázat, že běží jako root. I tak jej používá pouze ke změně některého užitečného textu.

Řešení 2:

To neodpovídá přímo na otázku, ale nemyslím si, že je zde položena správná otázka. Zdá se mi, že tazatel chce program, který se bude pravděpodobně chovat jinak, pokud má určitá oprávnění nebo ne, nicméně bych tvrdil, že kontrola sudo není způsob, jak toho dosáhnout. Za prvé, mnoho systémů nemusí implementovat "sudo", není to v žádném případě vyžadováno na Linuxu nebo mnoha Unixech.

Například uživatel může být již přihlášen jako root, takže sudo je nesmyslné, nebo možná má systém uživatele bez root, kteří stále mají schopnosti provádět administrativní úkoly, které si program může přát udělat. Nakonec možná systém nemá vůbec žádný root nebo sudo a místo toho používá povinný systém řízení přístupu s různými schopnostmi a nechytí všechny superuživatele do sudo. Nebo může být uživatel sudo, ale do účtu, který má z bezpečnostních důvodů -méně- oprávnění než jeho vlastní účet (často spouštím nedůvěryhodný kód s dočasným neprivilegovaným uživatelem, který může pouze zapisovat na ramdisky, aby se zahodil, ne zvýšil má oprávnění ). Celkově je špatný nápad předpokládat konkrétní model oprávnění, jako je sudo nebo existenci roota, nebo předpokládat, že uživatel sudoed má nějaká konkrétní oprávnění.

Pokud chcete zjistit, zda máte oprávnění k provedení operace, nejlepším způsobem je obvykle to jednoduše zkusit a provést a poté zkontrolovat errno pro problémy s oprávněními, pokud selže nebo zda se jedná o vícefázovou operaci, která musí buď selhat všechny, nebo všechny úspěšné. můžete zkontrolovat, zda operace bude fungovat s funkcemi, jako je funkce přístupu POSIX (zde pozor na možné závody, pokud se oprávnění aktivně mění)

Pokud navíc potřebujete znát skutečného uživatele za sudo, můžete použít funkci getlogin, která by měla fungovat pro jakoukoli interaktivní relaci se základním terminálem a umožnila by vám například zjistit, kdo „skutečně“ spouští příkaz pro audit nebo najít domovský adresář skutečného uživatele pro ukládání protokolů.

A konečně, pokud opravdu chcete zjistit, zda má uživatel přístup root (Stále špatný nápad, ale méně specifické pro implementaci), můžete použít getuid ke kontrole uid 0 a tedy root.

Řešení 3:

Existují dva mechanismy, které lze použít.

  • Kontrolu proměnných prostředí lze zfalšovat oběma způsoby, ale je to nejjednodušší. growisofs nerad běží pod SUDO, tak jsem zrušil nastavení proměnných SUDO ve skriptech, kde je používám. Dá se to předstírat i jinak. (Proměnné SUDO jsou také přenášeny do prostředí pro skripty spouštěné pod příkazy at a batch.)
  • Dalším způsobem, jak zjistit, zda používáte sudo, je projít seznam procesů od nadřazeného procesu a vyhledat sudo. Bylo by těžké skrýt, že tímto způsobem běžíte pod sudo, ale je to složitější. Stále je možné předstírat, že běžíte pod sudem.

Běžnější je zkontrolovat, zda běžíte jako správný uživatel. id lze k tomu použít příkaz. Skript TomOnTime používá id příkaz k určení, zda sudo může být vyžadováno spuštění dalšího příkazu.

Řešení 4:

Můžete porovnat efektivní a skutečné ID uživatele.

Neznamená to striktně, že spouští undo sudo (může být také setuid'd), ale znamená to, že program má více práv, než může uživatel očekávat. (například v programu, který se normálně spouští bez těchto práv, ale potřebuje být s nimi spouštěn během instalace nebo k instalaci aktualizací. Poté můžete tuto funkci použít k tomu, abyste o tom poskytli varovnou zpětnou vazbu).

Řešení 5:

Efektivní proměnnou UID (EUID) můžete zkontrolovat takto:

if [[ $EUID -eq 0 ]]; then
    echo "running as root"
else
    echo "not running as root"
fi

Linux
  1. Ssh – Potřebujete Tty ke spuštění sudo, pokud mohu sudo bez hesla?

  2. Jak poznám, že jsem na obrazovce?

  3. Paralelní spuštění skriptu shellu

  1. Jak mohu nastavit a spustit PhantomJS na Ubuntu?

  2. Spusťte Java program v backendu

  3. Barevný výstup programu běžícího pod BASH

  1. sudoers NOPASSWD:sudo:není přítomen tty a není zadán žádný program askpass

  2. Nelze spustit Sonar Server způsobený Elasticsearch nelze spustit jako root

  3. Mohu přimět SSH, aby používal program askpass, i když byl spuštěn z terminálu?