Vraag Sta gebruikers toe om het eigendom van een bepaald bestand te veranderen zonder sudo


Laten we zeggen dat we deze situatie hebben:

-rwxrwx-r- 1 user1 mygroup  0 Sep 12 16:53 testfile

Een groep ontwikkelaars werkt aan dezelfde VM (Linux). Ik moet het concept van afrekenen / inchecken simuleren. Als een gebruiker een bestand uitcheckt, mag niemand erin kunnen schrijven totdat hij het heeft ingecheckt.

Ik heb geprobeerd de eigenaar van het bestand te wijzigen; elke keer dat een gebruiker wil afrekenen, wordt hij de eigenaar van het bestand en voorkomt dat anderen hem schrijven en checkt vervolgens in door de eigenaar van het bestand naar de standaard te veranderen en de rechten van het bestand terug te zetten naar de standaard. Dit betekent dat ik nodig heb chown  en chmod maar deze commando's vereisen sudo en ik kan niet geven sudo toestemming voor ontwikkelaars.

Kan ik een gebruiker de mogelijkheid geven om chown en chmod alleen een specifiek bestand?


4
2017-09-13 14:32


oorsprong


zou het in deze situatie praktisch zijn om de gebruiker toestemming te geven voor het schrijven van de bovenliggende directory? Een gebruiker toestaan ​​te gebruiken sudo chown en sudo chmod is effectief zodat ze elk bestand kunnen wijzigen zoals ze willen, omdat daarna chownhet en chmodMaar, het zou er alles aan kunnen doen, zoals het omzetten in een uitvoerbaar script met willekeurige code - Zanna
Ik heb mijn bericht bewerkt om het echte probleem te beschrijven - ILY
"Als een gebruiker een bestand uitcheckt, mag niemand erin kunnen schrijven totdat hij het incheckt." Dat is waar groepen voor is. Bewerken: Zanna heeft het juist. - Rinzwind
maar dat is precies het punt dat Zaana mist als een gebruiker niet oppast dat hij een reeds uitgecheckt bestand kon afrekenen - ILY
Ik heb je gezegd hoe je moet doen waar je om vroeg, maar zoals gezegd in mijn antwoord werkt het alleen als gebruikers het controleren voordat ze beginnen - maar het zou hetzelfde zijn als ze zouden gebruiken sudo het heeft ook niet zoveel zin, maar ik denk het wel muru's antwoord geeft een goede oplossing - Zanna


antwoorden:


U moet een script schrijven dat controleert op de voorwaarden en vervolgens uw gebruikers geven sudo toegang tot dat alleen script. Zoiets als:

#! /bin/bash
set -e
die()
{
    printf "%s\n" "$@"
    exit 1
}

if [[ $EUID != 0 ]]
then
    die "This script must be run with sudo."
fi

DEFAULT_USER=nobody
SOURCE_DIR=/some/dir

cd "$SOURCE_DIR"

# Get path of file relative to the source directory
# Then we can check if it is actually in the directory.
FILE=$(realpath -e --relative-base="$SOURCE_DIR" "${1?}")    
if [[ $FILE == /* ]]
then
    die "$1 is outside $SOURCE_DIR."
fi

FILE_OWNER=$(stat -c %U "$FILE")

case $FILE_OWNER in
    $DEFAULT_USER)
        # checkout
        echo "Checking out $FILE..."
        chown "$SUDO_USER" "$FILE"
        ;;
    $SUDO_USER)
        # checkin
        echo "Checking in $FILE..."
        chown nobody "$FILE"
        ;;
    *)
        die "Sorry, this file is checked out by $FILE_OWNER."
        ;;
esac

Bewaar deze als, laten we zeggen, /usr/local/bin/check, voeg het volgende toe sudoers regel:

%dev ALL = (root) /usr/local/bin/check

Dat gaat ervan uit:

  • De ontwikkelaars zijn allemaal in de dev groep (als dat niet het geval is, gebruik dan gebruikersnamen of groepen).
  • De bestanden zijn in /some/dir. Wijzigen $SOURCE_DIR overeenkomstig.
  • De standaard gebruiker is nobodyen ongecontroleerde bestanden zijn het eigendom van de standaardgebruiker.
  • Niemand heeft schrijfrechten op de bronmap behalve root.

Dan kunnen de ontwikkelaars doen:

sudo check some/file

uitchecken /some/dir/some/fileen voer het nogmaals uit om het in te checken.


6
2017-09-14 05:26



met% dev ALL = (root) / usr / local / bin / check kan ik een argument toevoegen om hem alleen het bestand te laten uitvoeren (verhinderen schrijven), zodat hij het script niet kan wijzigen - ILY
@Ilyasse het bestand moet eigendom zijn van root en helemaal geen schrijfrechten hebben. - muru
yeaah precies bedankt is veel - ILY
+1 vooral omdat het elegant is geschreven maar toch beknopt en deels omdat ik geen antwoord hoef te schrijven, zodat ik me kan concentreren op mijn shopping bot-project: D - WinEunuuchs2Unix


U kunt dit doen, hoewel ik denk dat er waarschijnlijk een meer praktische oplossing is die is ontworpen voor dit soort samenwerking.

Hoe dan ook, hier is wat te doen:

Maak een groep, voeg de gebruikers toe aan de groep en geef de groep schrijfrechten op de bovenliggende map. Dan zullen ze in staat zijn om chown en chmod het bestand zonder gebruik sudo

Demonstratie:

sudo addgroup devs
sudo adduser zanna devs
sudo adduser pixie devs
mkdir development
chmod g+w development 
sudo chown root:devs development 
touch development/testfile
cd development
sudo chown root:devs testfile

Dat is de setup gedaan. Laten we het testen:

zanna@xubi:~/development$ chown $USER testfile
$ stat -C "%U %G" testfile
zanna devs
$ chmod 600 testfile
$ stat -c %a testfile
600
$ su pixie
[enter password...]
pixie@xubi:/home/zanna/development$ chown $USER testfile
$ stat -c %U testfile
pixie

en zo verder ... maar dit werkt alleen als mensen de rechten controleren of proberen te schrijven naar het bestand voordat ze beginnen te draaien chown en chmod, wat waarschijnlijk niet intuïtief is ... En als ze schrijfrechten hebben in de bovenliggende directory, zullen ze altijd kunnen dwingen om naar het bestand te schrijven, hoewel ze een waarschuwing zouden moeten krijgen, afhankelijk van de editor die ze gebruiken.


6
2017-09-13 17:48



Wat ik me afvraag is wat de gebruiker probeert te bereiken. Als het een ontwikkelmachine is, waarom maakt het dan uit of ontwikkelaars root hebben? En waarom geen gebruik maken van een soort broncontrolesysteem? Of bestandsvergrendeling? Voor mij klinkt het als een X-Y-probleem ... - vidarlo
precies het probleem gaat naar een bestandsvergrendelingsprobleem ik werk met GIT met bitbucket en bitbucket ondersteunt geen GIT LFS-vergrendelingsbestanden: / - ILY
Dit lost een deel van het probleem op (chown), maar als iemand op elk gewenst moment kan afrekenen, betekent dit dat we niets hebben gedaan, want als ik afrek, zou niemand moeten afrekenen totdat ik incheck - ILY


Als een gebruiker de mogelijkheid heeft om het volgende uit te voeren sudo opdracht:

sudo bash

Hij zal elk commando als root kunnen uitvoeren, inclusief chown op elk bestand.

U kunt configureren /etc/sudoers om een ​​specifieke gebruiker toe te staan ​​specifieke opdrachten uit te voeren

bijv. je kunt de volgende regel instellen /etc/sudoers:

user2 ALL=(ALL) NOPASSWD: /bin/chown
user2 ALL=(ALL) NOPASSWD: /bin/chmod

Opmerking: als iemand de mogelijkheid heeft om te werken chown en chmod als root ze    kan gemakkelijk vol raken root toegang (bijvoorbeeld door bewerken /etc/passwd)


3
2017-09-13 14:34



er is een bewerking op mijn post, eigenlijk wil ik niet dat hij alle commando's uitvoert ik wil gewoon dat hij het voorrecht heeft op chown en chmod - ILY
@Ilyasse - met die twee opdrachten geeft u de gebruiker de mogelijkheid om vol te raken root toegang ... - Yaron
ja ik was van plan om aan te geven dat dit inherent onveilig is, maar je laatste bewerking heeft het enigszins verholpen - Zanna
@Ilyasse - mijn antwoord geeft een voorbeeld van hoe te beperken sudo toegang tot specifieke commando ('s), als je echt je vriend wilt beperken, zonder te geven root toegang, je kunt de real probleem waarmee u wordt geconfronteerd, en we zullen proberen een goede oplossing voor uw specifieke behoeften te vinden - Yaron
Ik heb de post bewerkt om het echte probleem te beschrijven waarmee ik te maken heb - ILY


Ik ben het ermee eens dat een sccs (Source Code Control System) inclusief de originele uit de vroege jaren '70 een goede oplossing kan zijn voor het inchecken van gedeelde bestanden, omdat het versiebeheer en documentatie van wijzigingen onderhoudt.

Als een aanvulling op het voorstel van Zanna, een kort script dat controleert of de gebruiker de eigenaar is en vervolgens, als dat niet het geval is, controleert of de groep schrijfrechten heeft. Dat zou betekenen dat het was ingecheckt. Indien beschikbaar, zou het worden ingecheckt en vervolgens de rechten wijzigen in 600 (bestand bezet). Om het vrij te geven, zou het de rechten terugzetten naar 660. Zo zou de naam van de eigenaar aangeven wie het heeft geblokkeerd of wie het voor het laatst heeft vergrendeld en de groepstoestemming zou aangeven of het beschikbaar was of nog in gebruik was.


2
2017-09-13 21:57