GNU/Linux >> Znalost Linux >  >> Linux

Odlište každého uživatele Apache a udělte oprávnění

Pokud správně rozumím vaší otázce, váš problém začíná strukturou linuxového oprávnění/uživatelského rámce. Tedy uživatel vlastnící proces Apache je ten, kdo vytváří adresáře a soubory, když spouští váš skript.

Pokud potřebujete uživatelské oddělení pro skripty, např.:máte na svém serveru různé adresáře pro různé (virtuální) hostitele a nechcete, aby skript jednoho hostitele pracoval s daty jiného hostitele na stejném (apache) serveru, pak byste měli použít 'mpm_itk_module' místo běžnějšího 'mpm-prefork' apache.

Pomocí tohoto můžete jít a definovat uživatele/skupinu, kterou apache používá, když spouští nějaké skripty a např. vytvoří adresáře právě tímto příkazem pro každou položku virtuálního hostitele v httpd.conf:

<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>

Pokud opravdu chcete vytvořit různé adresáře z JEDNOHO spuštění skriptu, potřebujete, aby proces apache vlastnil root.root a pak skript musí nastavit oprávnění a vlastníky pro každý adresář tak, jak chcete.

Ale nikdy není dobrý nápad spouštět i ty nejlepší skripty na webovém serveru jako root, protože možná neuvažujete o žádném riziku.

Oddělení uživatele a práva pomocí vhosts se z mého pohledu zdá být mnohem úspornějším způsobem.

Dalším bodem - pouze PHP - je suPHP -> http://www.suphp.org

EDIT:

Dobře, podíval jsem se na vaše stránky, a i když neumím španělsky, vypadá to, že máte jen jednu webovou stránku, která slouží různým uživatelům, kteří neustále přicházejí přes tuto webovou stránku. Kde je tedy potřeba oddělení uživatelů na oprávněních linuxového souborového systému? Vše můžete omezit vaší aplikací, aniž byste potřebovali uživatele souborového systému. I když dáte např. další ftp přístup - omezte jej např. s proftpd má svůj vlastní chroot mech pro různé uživatele.

O práva k souborovému systému byste se měli starat pouze v případě, že nemůžete kontrolovat, kdo co provádí. To je běžný problém na hostiteli s více doménami, který byste mohli vyřešit pomocí modulu mpm_itk_module, který jsem zmínil.

Možná byste měl svou situaci popsat trochu více?

EDITACE 2:

Jak je naznačeno v komentáři, pokud používáte POUZE apache k tomu, abyste uživatelům poskytli přístup k souborům pro nahrávání/manipulaci, pak stačí umístit soubory mimo (!) kořenový strom dokumentů Apache a vytvořit jednoduchou databázi, abyste věděli, který soubor je vlastněn kterým uživatel:

user a | file parentdir/filename

Může to být jednoduchá tabulka a váš php kód poskytuje uživateli seznam z databáze, který soubor je schopen vidět/manipulovat a váš kód provede práci, jak bylo zamýšleno akcí uživatele.

Dokud uživateli neposkytnete přístup k souborům jinými službami (ftp, ssh, atd.), NENÍ potřeba pracovat s uživatelskými právy linuxu. Jen se postarejte o to, abyste soubory umístili mimo kořenový adresář dokumentů serveru, aby k souborům měl přístup pouze váš php kód s právy uživatele Apache vašeho serveru.

EDITACE 3:

Haha, teď jsem konečně dostal váš problém poté, co jsem si přečetl váš podobný příspěvek:(Jak může uživatel Apache zapisovat soubory, když k tomu má oprávnění?) V tomto případě (se SKUTEČNĚ anonymními uživateli na vaší webové stránce) nemáte ŽÁDNOU šanci tohle vůbec řešit. S každým návštěvníkem se zachází jako se stejným návštěvníkem bez autentizace. A jak jsem předpokládal ve své poslední ÚPRAVĚ a komentoval jsem to v podobném příspěvku:není třeba vůbec zacházet s oprávněními k souborům linux.

VAŠE ŘEŠENÍ;) :Manipulaci se soubory musíte provést v jedné relaci s ID relace, když uživatel navštíví vaši stránku. Váš kód tedy musí zvládnout vztah mezi návštěvníkem (id relace) a souborem, který nahrál s tímto id relace. Nejlepším způsobem, jak toho dosáhnout, je použití session-id, které je platné, dokud je návštěvník online. A znovu – není potřeba oprávnění k souborovému systému....;)

Druhý způsob je s ověřenými uživateli, jak bylo navrženo výše:Vytvořte db tabulku s uživateli/hesly pro přihlášení na webovou stránku (nikoli na server) a další tabulku, která obsahuje vztahy uživatel/soubor. Poté, co se přihlásí na webovou stránku, znovu pracujte s relacemi, abyste uživateli umožnili přístup/manipulaci s již nahranými soubory.


Mohu, že spouštíte apache s mod_php. Takže to znamená, že vaše instance PHP pracuje pod instancí Apache a má apache USER a GROUP. Můžete vytvořit složku a změnit vlastníka této složky, ale vlastníkem musí být uživatel ve vašem systému (ne Apache nebo stejný virtuální uživatel).

Ale můžete do každého adresáře uložit soubor například ".permitions" a vložit do toho souboru virtuálního vlastníka. Dále musíte filtrovat každý pokus o zápis (smazat, přejmenovat atd...) do tohoto adresáře a porovnat svého virtuálního uživatele a uživatele uloženého v souboru .permitions.

Ukázková třída (není plná, ale je více než dostačující k pochopení myšlenky):

class UserDirs {
  private $path='/home/vusers';

  public function mkdir($user){
      $d = $this->path.'/'.md5($user);
      mkdir($d);
      file_put_contents($d."/.owner",$user);
  }

  public function checkOwner($user, $dirname){
       $f = $dirname."/.owner";
       $virtual_owner = file_get_contents($f);
       return $user === $virtual_owner;
  }

}

$d = new UserDirs()
$d->mkdir("foo","bar");
echo $d->checkOwner("foo1","bar") === true ? "OK":"FAIL";
echo $d->checkOwner("foo","bar") === true ? "OK":"FAIL";

V této třídě můžete zapouzdřit vše, co potřebujete pro práci s UserDirs, a rozšířit třídu podle vašich požadavků.


Vaši uživatelé nemají systémové účty. Pravděpodobně není možné vytvořit tyto účty. Proto bych doporučil toto vše spravovat přes webové uživatelské rozhraní.

Pokračujte ve vytváření adresářů tak, jak jste. Oprávnění jsou v pořádku. Vaše uživatelské rozhraní se však musí změnit, aby zobrazovalo pouze adresář nebo soubory daného uživatele. Předpokládám, že máte databázi spojenou s touto stránkou. Přiřaďte uživatelská jména a náhodně vygenerovaný název adresáře k uživateli. Pokud se někdo pokusí přejít na přímou cestu a NENÍ uživatelem spojeným s tímto adresářem, kopněte jej zpět na přihlašovací obrazovku.

Pro ilustraci jsem vytvořil účet s názvem test a pravděpodobně dostal jedinečný adresář. Pokud se odhlásím, neměl bych mít možnost navštívit tento adresář, protože váš kód by to viděl

  • Nejsem přihlášen, a proto nemám přístup k tomuto adresáři

Pokud bych se měl přihlásit jako test2 a navštivte adresář test , váš kód by to měl vidět

  • Nejsem vlastníkem navštíveného adresáře, a proto bych měl být podle potřeby přesměrován.

Musíte přidat funkci, která kontroluje adresář, který uživatel navštěvuje, a porovnává jej s adresářem spojeným s uživatelem. Pokud se dva shodují, nechejte je pokračovat. Pokud se neshodují, přesměrujte uživatele.


Linux
  1. Oprávnění a ukládání souborů?

  2. Ubuntu – Jak nakonfigurovat oprávnění, aby mohli Gedit, Apache a Ide hrát společně?

  3. Základy uživatele a databáze MySQL

  1. zásobník jádra a zásobník uživatelského prostoru

  2. Zachování oprávnění souborů a složek pomocí rsync

  3. Pod jakým uživatelem by měl Apache a PHP běžet? Jaká oprávnění by měly mít soubory /var/www?

  1. Priorita uživatele a vlastníka skupiny v oprávněních k souboru?

  2. Ssh a oprávnění k domovskému adresáři?

  3. Linux – Mount Cifs Network Drive:Oprávnění k zápisu a Chown?