Apakah PermitRootLogin berdasarkan UID atau nama pengguna?

17

Halaman manual menyatakan itu PermitRootLogin

Menentukan apakah root dapat login menggunakan ssh(1).

Namun, tidak jelas apakah pemeriksaan ini didasarkan pada nama pengguna ( "root") atau UID ( 0).

Apa yang terjadi jika akun root diubah namanya menjadi "admin"? Akan "admin"dapat masuk kapan PermitRootLogin=no?

Apa yang terjadi jika ada dua akun dengan UID = 0, yaitu "root"dan "admin"? Apakah mereka bisa masuk?

ge0rg
sumber

Jawaban:

16

Tampaknya pemeriksaan dilakukan pada UID (diuji pada OpenSSH_6.7p1 Debian-5+deb8u3, OpenSSL 1.0.1t 3 May 2016):

Nonaktifkan PermitRootLogin:

mtak@pdv1:~$ grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin no

Pastikan pengguna bernama admindibuat dengan UID 0:

mtak@pdv1:~$ sudo grep admin /etc/passwd
admin:x:0:0:Root User:/root:/bin/bash

Pastikan pengguna dapat digunakan untuk masuk ke sistem:

mtak@pdv1:~$ su - admin
Password: 
root@pdv1:~# 

Periksa apakah kita dapat masuk ke sistem menggunakan SSH:

mtak@rubiks:~$ ssh admin@pdv1
admin@pdv1's password: 
Permission denied, please try again.

Jika kita mengaktifkan PermitRootLogin pada:

mtak@pdv1:~$ grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin yes

Dan cobalah masuk:

mtak@rubiks:~$ ssh admin@pdv1
admin@pdv1's password: 
Linux pdv1 4.4.8-1-pve #1 SMP Tue May 17 16:14:08 CEST 2016 x86_64
Last login: Wed Aug 24 12:05:28 2016 from xxx
root@pdv1:~# 
mtak
sumber
Menarik bahwa meskipun UID 0 memiliki admin nama pengguna, masih muncul seperti root@pdv1di shell
Dezza
1
@Dezza Mungkin tergantung pada baris urutan yang tercantum di / etc / passwd (seperti pada: cari entri pertama dengan UID = 0).
TripeHound
19

Saya menghargai pendekatan @mtak dalam jawaban lain, tetapi jawabannya jelas bahkan tanpa uji coba ini.

Ini didasarkan pada UID, seperti yang Anda lihat dalam kode sumber openssh:

if (authctxt->pw->pw_uid == 0 &&
            !auth_root_allowed(auth_method))
authenticated = 0;

Juga setiap metode otentikasi menunjukkan sesuatu seperti

if (pw->pw_uid == 0 && options.permit_root_login != PERMIT_YES)
    ok = 0;

grep-lebih jauh dalam kode, Anda mungkin memperhatikan, tidak ada strcmp('root', pw->pw_name)atau beberapa alternatif, jika itu akan cukup untuk Anda.

Jakuje
sumber
Bagaimana Anda tahu sshd cek untuk UID 0? Anda tidak menggunakan argumentasi apa pun untuk mendukung pernyataan Anda.
mtak
2
Unix mendefinisikan superuser dengan UID = 0. Sebagai contoh lain dapat menjadi kode sumber dari openssh.
Jakuje
Kernel melakukannya, tetapi Anda mengasumsikan OpenSSH juga melakukannya. Misalnya, otentikasi dasar Apache juga tidak mengizinkan login root, bukan? Terima kasih atas tautannya, saya telah memodifikasi jawaban Anda untuk memasukkannya.
mtak
1
Jika itu dilakukan dengan cara lain, itu akan menjadi risiko keamanan potensial.
Jakuje
3
@ Bakuriu dan mengapa itu akan menciptakan pwkonteks dari sesuatu yang lain. The opensshkode open source dan pembaca yang tertarik dapat pergi melalui seluruh kode. Konstruksi serupa ada di seluruh kode untuk setiap metode otentikasi. Jika Anda grepmelalui kode, Anda tidak akan pernah menemukan strcmp('root', pw->pw_name), jika itu akan membuatnya lebih dapat diandalkan untuk Anda.
Jakuje