Consenti a apache di scrivere nelle directory .ssh degli utenti

2

So che il titolo sta solo lanciando "la tua configurazione non è sicura", ma permettimi di spiegare.

Sto lavorando a un'applicazione che mira a consentire ai client di eseguire il rsync su SSH sul nostro server. Abbiamo bisogno di un'applicazione web da cui possiamo creare / ruotare le chiavi SSH per i nostri utenti. Questa applicazione restituirà all'utente una chiave SSH privata per il loro uso futuro e memorizzerà il file authorized_keys dell'utente della chiave pubblica.

Al momento della registrazione, dovremo creare automaticamente l'utente e la directory e le chiavi .ssh iniziali.

Ora siamo su CentOS 5, ma siamo flessibili se c'è una ragione sufficiente per migrare. Questo server eseguirà solo questa applicazione Web in Apache (come apache: apache) e nessun dato diverso dai dati dell'utente sincronizzati verrà memorizzato nel sistema.

Ho pensato alla seguente soluzione, ma ho avuto dei problemi:

  1. Concedi sudo useradd privilegi all'utente apache per consentire loro di creare nuovi utenti
  2. Chiama sudo useradd dallo script PHP nell'applicazione web con una umask di 000 nella directory home appena creata.
  3. chgrp la nuova directory home a apache in modo che apache possa creare una nuova directory .ssh e scrivere le chiavi. *
  4. chmod la nuova directory home a 770 in modo che solo l'utente e l'apache abbiano accesso. *
  5. mkdir .ssh nella nuova directory home e ssh-keygen per creare la nuova chiave, memorizzando la chiave pubblica in authorized_keys e restituendo la chiave privata al client chiamante.

I problemi che sto incontrando sono con i punti * d - sembra che, anche con chmod 777 non riesco a chgrp o chmod della directory, come è stato creato con il proprietario e il gruppo appartenente al nuovo utente.

Ho cercato di cambiare il gruppo predefinito dell'utente in qualcosa che avrebbe permesso a Apache di scrivere su di esso, ma non riesco a trovare un modo per farlo senza dover concedere i privilegi sudo di apache usermod su, che sembra un davvero pessima idea.

Ogni pensiero sarebbe apprezzato!

    
posta Jeff Allen 10.04.2012 - 22:49
fonte

2 risposte

4

Crea uno script che esegua tutte le azioni privilegiate con una convalida stretta e facendone controllare.

Lo script ottiene solo il nome utente come parametro e deve convalidarlo:

  • contiene solo caratteri utente validi
  • l'utente con quel nome non esiste (non è un account amministrativo, ecc.)

Se hai davvero bisogno di generare la chiave privata sul server (guarda con attenzione le alternative), lo script dovrebbe emettere la chiave privata sullo stdout.

Concedi l'autorizzazione sudo a questo script per l'utente apache. Lo script contiene i comandi chmod / chgrp ma solo dopo aver effettuato la convalida. L'utente apache quindi non ha bisogno di autorizzazioni sudo per quei comandi.

È possibile eseguire lo script come terzo utente che dispone dell'autorizzazione sudo per i comandi di sistema anziché eseguire lo script come root. Se questo passaggio aggiuntivo è utile dipende dalla valutazione del rischio dello script.

Apache esegue lo script usando sudo e raccoglie stdout con la chiave privata per inviarlo al browser web.

    
risposta data 11.04.2012 - 00:34
fonte
4

Probabilmente suggerirei che cron aprisse uno script che non facesse altro che modificare quei file con qualsiasi cosa fosse accodata nel database da fare.

Consenti a quella parte dello script di agire interamente al di fuori del regno dell'utente di apache e di essere in grado di bloccare l'account per fare solo quell'attività.

Questo è semplicemente fuori di testa, anche se come una soluzione più semplice.

    
risposta data 10.04.2012 - 22:54
fonte

Leggi altre domande sui tag