Wie können Shared Keys .ssh / authorized_keys und sudo zusammenarbeiten?

15

Ich habe die .ssh / authorized_keys eingerichtet und kann mich mit dem neuen "Benutzer" mit dem pub / private Schlüssel anmelden. Ich habe auch "Benutzer" zur sudoers-Liste hinzugefügt. Das Problem, das ich jetzt habe, ist wann Ich versuche, einen sudo-Befehl auszuführen, der etwa so einfach ist:

$ sudo cd /root

Es fordert mich zur Eingabe meines Passworts auf, funktioniert aber nicht (ich verwende das von mir festgelegte Passwort für den privaten Schlüssel).

Außerdem habe ich das Passwort des Benutzers mit deaktiviert

$ passwd -l user

Was vermisse ich?

Irgendwo werden meine ersten Bemerkungen missverstanden ...

Ich versuche, mein System abzusichern. Das ultimative Ziel ist die Verwendung von Pub / Private-Schlüsseln für Anmeldungen im Gegensatz zur einfachen Kennwortauthentifizierung. Ich habe herausgefunden, wie man das alles über die authorized_keys-Datei einrichtet.

Außerdem werde ich letztendlich Server-Anmeldungen über das Root-Konto verhindern. Aber bevor ich das tue, brauche ich sudo, um für einen zweiten Benutzer zu arbeiten (den Benutzer, mit dem ich mich die ganze Zeit im System anmelde).

Für diesen zweiten Benutzer möchte ich regelmäßige Kennwortanmeldungen verhindern und nur Anmeldungen mit öffentlichen / privaten Schlüsseln erzwingen. Wenn ich den Benutzer nicht über "passwd -l user ..." sperre, kann ich trotzdem einen Schlüssel verwenden Holen Sie sich mit einem normalen Passwort in den Server.

Aber was noch wichtiger ist, ich muss sudo dazu bringen, mit einem Pub / Private Key-Setup mit einem Benutzer zu arbeiten, dessen / dessen Passwort deaktiviert ist.


Bearbeiten: OK, ich denke, ich habe es (die Lösung):

1) Ich habe / etc / ssh / sshd_config angepasst und festgelegt. PasswordAuthentication no Dadurch werden SSH- Kennwortanmeldungen verhindert. ( Stellen Sie sicher, dass Sie zuvor einen funktionierenden öffentlichen / privaten Schlüssel eingerichtet haben

2) Ich habe die Sudoer-Liste angepasst visudound hinzugefügt

root      ALL=(ALL) ALL
dimas     ALL=(ALL) NOPASSWD: ALL

3) root ist das einzige Benutzerkonto, das ein Passwort hat. Ich teste mit zwei Benutzerkonten "dimas" und "sherry", für die kein Passwort festgelegt wurde (Passwörter sind leer, passwd -d user).

Das Obige verhindert im Wesentlichen, dass sich jeder mit Passwörtern beim System anmeldet (ein öffentlicher / privater Schlüssel muss eingerichtet sein).

Zusätzlich haben Benutzer in der Sudoer-Liste Administratorrechte. Sie können auch suauf verschiedene Konten. "Dimas" kann also grundsätzlich, "dimas" sudo su sherryjedoch NICHT su sherry. Ebenso kann jeder Benutzer, der NICHT in der sudoers-Liste steht, NICHT su useroder sudo su user.

ANMERKUNG Das oben Genannte funktioniert, wird jedoch als unzureichende Sicherheit angesehen. Jedes Skript, das als "dimas" - oder "sherry" -Benutzer auf Code zugreifen kann, kann sudo ausführen, um Root-Zugriff zu erhalten. Ein Fehler in ssh, durch den sich Remotebenutzer trotz der Einstellungen anmelden können, eine Remotecodeausführung in so etwas wie Firefox oder ein anderer Fehler, durch den unerwünschter Code ausgeführt werden kann, wenn der Benutzer sich als Root anmeldet, können nun ausgeführt werden. Sudo sollte immer ein Passwort erfordern, oder Sie können sich auch als root anstelle eines anderen Benutzers anmelden.

farinspace
quelle

Antworten:

10

sshund sudonichts miteinander zu tun haben. Das Einrichten einer sshAuthentifizierungsmethode kann nichts bewirken sudo. sudowird kein sshPasswort verstehen .

passwd -lsoll ein Benutzerkonto sperren, damit er sich nicht mehr per Passwort authentifizieren kann. Das ist so ziemlich das Gegenteil von dem, was Sie wollen: Der Benutzer kann sich ohne Passwort authentifizieren.

Ich denke, was Sie wollen, ist die NOPASSWDOption in Ihrer sudoersDatei .

(PS, es gibt keinen Grund, einen cdBefehl mit auszuführen sudo. cdWird nicht an übergeordnete Prozesse weitergegeben. Sobald das sudoProgramm beendet ist, sind Sie wieder da, wo Sie begonnen haben.)

Bearbeiten: Sie sagen immer wieder, dass Sie das Kontokennwort sperren möchten und sudo öffentliche / private Schlüssel verstehen soll. Entschuldigung, sudo verwendet keine ssh-Schlüssel. Es ist nicht ssh. Wenn Sie nicht möchten, dass Benutzer sich mit ihren Kennwörtern anmelden können, besteht die Antwort meiner Meinung nach darin , die SSH-Kennwortauthentifizierung zu deaktivieren und das Konto nicht zu sperren. Anschließend können Sie ein Kennwort für die Benutzer speichern, mit dem sie nach der Anmeldung über ssh authorized_keys Sudo ausführen können.

Kegeltöter
quelle
OK, aber hat die Tatsache, dass der Benutzer kein Passwort über: passwd -l user ... hat, zur Folge, dass der Befehl sudo nicht funktioniert?
Farinspace
@farinspace Ja, ich verstehe die Frage besser und habe meine Ausführungen wesentlich erweitert. passwd -lEntfernt das Passwort in dem Sinne, dass das Konto GESPERRT ist - das heißt, dass kein Passwort funktioniert. Sie möchten die Kennwortauthentifizierung in sudo deaktivieren.
Coneslayer
wie lautet diese logik: das ausschalten des kennworts in der sudoers-datei wäre immer noch sicher, da das system über die pub / private key-logins gehärtet wird ... und wieder nur der admin in der lage wäre, benutzer zur sudoers-liste hinzuzufügen
farinspace
Wenn Sie einen privaten Schlüssel verwenden, ist es typisch, ein Passwort dafür
festzulegen
4
@coneslayer Diese Antwort ist nicht 100% genau. Wie Sie unten sehen können, kann sudo so konfiguriert werden, dass die ssh-Authentifizierung eingehalten wird.
Andre de Miranda
18

Was Sie tun möchten, ist möglich, erfordert jedoch einige Erfahrung, da Sie ein PAM-Modul namens pam-ssh-agent-auth kompilieren müssen .

Der Vorgang ist relativ einfach:

$ sudo aptitude install libssl-dev libpam0g-dev build-essential checkinstall
$ wget "http://downloads.sourceforge.net/project/pamsshagentauth/pam_ssh_agent_auth/v0.9.3/pam_ssh_agent_auth-0.9.3.tar.bz2"
$ tar -xjvf pam_ssh_agent_auth-0.9.3.tar.bz2
$ cd pam_ssh_agent_auth-0.9.3

$ ./configure --libexecdir=/lib/security --with-mantype=man

$ make
$ sudo checkinstall

Das Bearbeiten der Sudo-Konfiguration:

$ sudo visudo

Fügen Sie Folgendes hinzu:

Defaults env_keep += SSH_AUTH_SOCK

Fahren Sie fort, indem Sie die sudo PAM-Einstellungen ändern:

$ sudo vi /etc/pam.d/sudo

Hinzufügen (direkt über den @ include-Zeilen):

**auth [success=2 default=ignore] pam_ssh_agent_auth.so file=~/.ssh/authorized_keys**
@include common-auth
@include common-account
Andre de Miranda
quelle
4
Dies sollte die akzeptierte Antwort sein
Christopher Monsanto
1
Diese Anleitung (insbesondere die /etc/pam.d/sudoAnleitung) ist für aktuelle Ubuntu-Versionen nicht mehr aktuell. Ich habe in meiner Antwort aktualisierte Anweisungen gegeben.
Chris Pick
4

Die Antwort von Andre de Miranda bietet eine nette Lösung mit pam_ssh_agent_auth , aber Teile sind veraltet. Besonders die /etc/pam.d/sudoAnleitung bei Verwendung vieler aktueller Linux-Versionen.

Wenn Sie Ubuntu 12.04 präzise ausführen, habe ich den Prozess durch die Bereitstellung eines pam_ssh_agent_auth-Builds aus einem ppa: ppa: cpick / pam-ssh-agent-auth vereinfacht .

Sie können das Paket installieren, indem Sie Folgendes ausführen:

sudo add-apt-repository ppa:cpick/pam-ssh-agent-auth
sudo apt-get install pam-ssh-agent-auth

Wenn Sie dieses PAM-Modul nach der Installation mit sudo verwenden möchten, müssen Sie die Einstellungen von sudo und die PAM-Konfiguration konfigurieren. In Ubuntu 12.04 können Sie dies genau tun, indem Sie die folgenden zwei Dateien erstellen:

/etc/sudoers.d/pam-ssh-agent-auth:

Defaults    env_keep+="SSH_AUTH_SOCK"

/etc/pam.d/sudo:

ent#%PAM-1.0

auth       required   pam_env.so readenv=1 user_readenv=0
auth       required   pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
auth       sufficient pam_ssh_agent_auth.so file=/etc/security/authorized_keys
@include common-auth
@include common-account
@include common-session-noninteractive

Wenn Sie Chefkoch sind, kann der obige Vorgang mit meinem Kochbuch automatisiert werden, das sich an einer der beiden folgenden Stellen befindet:
https://github.com/cpick/pam-ssh-agent-auth
http: //community.opscode .com / kochbücher / pam-ssh-agent-auth .

Das filesVerzeichnis des Kochbuchs enthält die oben beschriebenen Dateien /etc/pam.d/sudound /etc/sudoers.d/pam-ssh-agent-auth, die mit Ubuntu 12.04 genau funktionieren, und sollte ein hilfreicher Ausgangspunkt sein, wenn Sie andere Versionen / Distributionen verwenden.

Chris Pick
quelle
-1

Die einzige Möglichkeit, die Eingabe eines Kennworts zu umgehen, besteht darin, es in Ihrer sudoersDatei zu deaktivieren .

So etwas wird rootallen Mitgliedern wheel uneingeschränkten Zugriff ohne Passwort geben:

root    ALL=(ALL)   NOPASSWD: ALL
%wheel  ALL=(ALL)   NOPASSWD: ALL

Dies wird jedoch absolut nicht empfohlen . Wenn Sie einen bestimmten Befehl haben, den dieser Server ausführen soll, gewähren Sie ihm nur Zugriff auf diesen Befehl. Oder noch besser, finden Sie einen anderen Weg, um das zu erreichen, was Sie tun möchten, ohne ein Sicherheitsloch zu stanzen.

Jack M.
quelle
Es macht mir nichts aus, das Passwort zu verwenden. Das Problem scheint zu bestehen, nachdem ich das Benutzerpasswort deaktiviert habe über: passwd -l user ... Ich kann mich immer noch über den Pub / Private Key beim System anmelden (Private Key hat ein sicheres Passwort). Wenn ich ein Sudo mache, frage ich nach einem Passwort, aber dies ist nicht das Passwort des privaten Schlüssels. Wo ist dieses Passwort gesetzt, wenn ich es für den Benutzer deaktiviert habe? auf dem privaten Schlüssel)
farinspace
"Wo ist dieses Passwort gesetzt, wenn es für den Benutzer deaktiviert wurde?" Nirgends. Es gibt kein Passwort, das Sie eingeben können, da Sie das Konto gesperrt haben.
Coneslayer
Sie müssten das Konto auf dem Remote-System erneut aktivieren und dann das Kennwort festlegen. In jedem Fall sollten Sie das Kennwort auf beiden Computern beibehalten. Wenn im Fehlerfall kein anderer Grund als lokale Anmeldungen vorliegt.
Jack M.