Mengapa saya dapat membuat Pengguna dengan UID yang sama?

37

Pemahaman saya tentang UID adalah integer positif unik yang diberikan oleh sistem operasi mirip-Unix kepada setiap pengguna. Setiap pengguna diidentifikasi ke sistem dengan UID-nya, dan nama pengguna umumnya hanya digunakan sebagai antarmuka untuk manusia.

Bagaimana dua pengguna dapat memiliki UID yang sama, bukankah ini konflik untuk sistem dan paket saya?

root@kdc:~# id test12
uid=1005(test10) gid=1000(server) groups=1005(test10)
root@kdc:~# id test13
uid=1005(test10) gid=1000(server) groups=1005(test10)
root@kdc:~#

Saya telah menambahkan dua pengguna dengan UID dan GID yang sama: test12dan test13

Output dari /etc/passwd:

client@kdc:~$ cat /etc/passwd | grep test12
test12:x:1005:1000::/home/test12:/bin/sh
client@kdc:~$ cat /etc/passwd | grep test13
test13:x:1005:1000::/home/test13:/bin/sh

Saya menambahkan pengguna dengan useradd -ou 1005 -g1000 username.

Saya bingung apa tujuan dari ini, dan bisakah itu memengaruhi izin dan log pengguna dll. Jadi sekarang jika pengguna ditambahkan dengan uid=0dan gid=0akan memiliki hak istimewa seperti akun root?

nux
sumber
Tidak yakin tentang itu, tapi saya pikir output mencetak UID pengguna "test10" di kedua perintah. Mengapa melakukan itu, saya tidak tahu, tetapi harus beberapa pengguna yang Anda buat sebelumnya.
animaletdesequia
seolah-olah mengatakan ada pengguna yang memiliki id ini
nux
OK, saya salah paham pertanyaannya. Saya pikir Anda membuat pengguna secara normal dan sistem memberikan UID yang sama kepada mereka.
animaletdesequia
tidak ada manusia tidak normal, pertanyaannya di sini, bagaimana sistem menerima uids unik
nux
Oke. Pertanyaan bagus, terima kasih atas penjelasannya :)
animaletdesequia

Jawaban:

40

Jawabannya di sini adalah bahwa Linux tidak melindungi Anda dari diri Anda sendiri.

Jika Anda benar-benar ingin su rootdan masuk ke file / etc dan memberikan semua pengguna UID yang sama, Anda bisa. Itu hanya file teks.

Tetapi Anda benar-benar tidak boleh dan itu akan memiliki konsekuensi yang tidak diinginkan.

Digital Chris
sumber
4
pertanyaan saya adalah mengapa sistem menerima ini?
nux
46
Apa maksudmu "menerimanya"? Bagaimana itu TIDAK menerimanya? ini seperti menjadi koki dan bertanya mengapa sup memungkinkan Anda memasukkan terlalu banyak garam ke dalamnya. Dalam hal komputasi modern, Anda mungkin terbiasa dengan mentalitas RDBMS, di mana hambatan pada hal-hal penting seperti ID membuat Anda tidak bisa menembak diri sendiri. ID pengguna Linux jauh lebih primitif dan tidak memiliki pemeriksaan atau koreksi internal.
Digital Chris
5
Benar, dan dengan menggunakan useradd -oAnda mengenali bahwa Anda berada di luar norma adduser. Seperti @psusi sebutkan, itu membuat dua login menunjuk ke ID yang sama sejauh izin file dll. Ini mungkin juga menciptakan masalah karena itu bukan kasus penggunaan normal dan tidak diragukan lagi belum teruji dengan banyak paket.
Digital Chris
2
Jawab: memiliki 2 login yang menunjuk ke izin sistem file yang identik.
Digital Chris
5
@Josh tentu saja, ada alasan yang sah untuk memiliki banyak pengguna dengan UID yang sama, lihat jawaban saya untuk satu contoh.
terdon
38

Sebenarnya ada alasan yang valid untuk ini. Sebagai contoh, saya dulu bekerja di lab di mana kami masing-masing memiliki komputer kami sendiri tetapi kami $HOMEberada di drive bersama yang diekspor oleh server. Jadi, saya $HOMEadalah

/users/terdon

Karena /usersfolder itu sebenarnya bukan pada mesin lokal saya tetapi diekspor melalui NFS, untuk setiap analisis yang berat pada I / O, saya akan menggunakan data yang disimpan pada hard drive lokal saya agar tidak membebani jaringan lab. Untuk itu saya, dan semua orang, memiliki dua pengguna: satu yang seluruh sistem dan satu yang lokal ke mesin yang dimaksud. Rumah pengguna lokal adalah

/home/localuser

Namun, saya perlu memiliki akses penuh ke file saya apakah saya login sebagai terdonatau sebagai localuserdan cara sysadmin kami telah diterapkan yaitu dengan memberikan UID keduanya localuserdan terdonyang sama. Dengan begitu, saya bisa dengan bebas memanipulasi file lokal saya terlepas dari pengguna mana saya saat ini masuk.

terdon
sumber
6
Untuk mendukung jawaban ini, perlu dicatat bahwa beberapa pengaturan seperti virtual email hosting menggunakan ini untuk efek yang besar, yaitu sejumlah besar akun email virtual berbagi UID tunggal - dokumentasi untuk server surat Dovecot sebenarnya menyarankan ini sebagai pendekatan opsional di wiki2.dovecot.org/UserIds#mailusers
Matt Thomason
tidak akan chmod 666memiliki dampak yang sama?
Brian
3
@GIJoe yang akan memungkinkan kedua pengguna untuk membaca / menulis tetapi itu tidak mempertahankan kepemilikan yang bisa menjadi masalah. Selain itu, tidak semua file dapat disetel ke izin tersebut (misalnya kunci ssh) dan tidak praktis untuk perlu bermain dengan izin sepanjang waktu.
terdon
12

Dua pengguna dapat memiliki UID yang sama karena itu hanya angka dalam file teks sehingga Anda dapat mengaturnya untuk apa pun yang Anda inginkan, termasuk nilai yang sudah digunakan. Seperti yang telah Anda lihat, melakukan itu bukanlah ide yang baik.

psusi
sumber
lalu bagaimana sistem menangani pengguna? izin berbagi
nux
12
@ Neux, keduanya adalah pengguna yang sama. Mereka hanya dapat memiliki nama pengguna / kata sandi yang berbeda untuk tujuan masuk.
psusi
4
@ bigbadonk420, istilah "didukung" agak kabur. Tentunya ini adalah sesuatu yang selalu dapat Anda lakukan pada sistem unix dan dulunya merupakan pintu belakang yang cukup umum untuk mengatur pengguna lain yang memiliki 0 sehingga Anda dapat login dan secara efektif menjadi root, tanpa perlu tahu atau mengubah kata sandi pada pengguna root normal.
psusi
1
@ bigbadonk420 didukung, ada kasus di mana ini berguna, lihat jawaban saya untuk satu contoh.
terdon
11

Sebenarnya cukup umum untuk memiliki dua pengguna dengan ID yang sama. Di FreeBSD, biasanya ada dua pengguna dengan UID 0: root dan toor. Root menggunakan shell built-in / bin / sh, dan toor menggunakan shell yang berbeda, biasanya bash.

andybalholm
sumber
11

Sistem Unix & Linux umumnya tidak melakukan apa pun untuk melarang duplikat dalam /etc/passwdfile. Maksud dari file ini adalah untuk mengaitkan UID dengan nama fisik yang dapat ditampilkan oleh alat-alat baris perintah seperti lsketika pengguna mendaftar file.

$ ls -n | head -5
total 986000
drwxrwxr-x.   3 1000 1000      4096 Feb 13 19:51 1_archive_sansa
-rw-rw-r--.   1 1000 1000    760868 Dec 16 08:21 2.18.x Database Scheme.jpg
-rw-rw-r--.   1 1000 1000       972 Oct  6 20:26 abcdefg
drwxrwxr-x.   2 1000 1000      4096 Feb 11 03:34 advanced_linux_programming

Tujuan lain dari file ini adalah untuk menentukan shell apa yang akan didapatkan pengguna saat mereka login.

$ getent passwd saml
saml:x:1000:1000:saml:/home/saml:/bin/bash

Vektor serangan umum pada sistem tipe Unix adalah menambahkan baris seperti ini ke /etc/passwdfile sistem :

$ getent passwd r00t
r00t:x:0:0:root:/root:/bin/bash

$ getent passwd toor
toor:x:0:0:root:/root:/bin/bash

Peran /etc/passwdfile TIDAK dimaksudkan untuk hanya melacak akun pengguna. Peran melacak nama pengguna dan kata sandi adalah tanggung jawab /etc/shadowfile tersebut. File seperti /etc/passwddan /etc/groupbenar-benar dimaksudkan untuk memberikan nama yang dapat dibaca manusia ketika sistem Anda mendaftar file dari disk.

Ingat bahwa file Anda ditulis ke disk menggunakan UID / GID bukan nama sebenarnya.

$ stat afile 
  File: ‘afile’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 6560621     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-02-27 15:54:21.852697029 -0500
Modify: 2014-02-27 15:54:21.852697029 -0500
Change: 2014-02-27 15:54:21.852697029 -0500
 Birth: -

Perhatikan Uid:dan Gid:, angkanya adalah apa yang sebenarnya ditulis ke disk!

slm
sumber
9

Di Linux, semua pengguna dan grup sebenarnya hanya angka. Itulah yang ditampilkan dari idperintah yang Anda posting.

The /etc/passwdberkas peta pengguna nama pengguna ID (nomor) dan dalam contoh yang harus Anda berikan, Anda hanya dipetakan dua username dengan ID pengguna yang sama.

Secara efektif, Anda telah membuat satu pengguna test12,, ID 1005, yang juga memiliki nama pengguna kedua test13. Namun sistem akan memetakan UID 1005 ke nama pengguna pertama yang ditemukannyatest12

Linux "memungkinkan" Anda melakukan ini karena tidak ada sistem untuk mencegah Anda melakukan ini. /etc/passwdhanya file teks, nama pengguna dipetakan ke UID yang ditemukan untuk entri mereka dalam file itu, UID dipetakan ke nama pengguna pertama yang ditemukan dalam file itu.

Tetapi apa yang Anda buat adalah situasi yang membingungkan bagi administrator systams lainnya; menghindarinya dengan mengubah UID daritest13

Josh
sumber
ini adalah penguji mesin virtual saya, pertanyaan saya apakah ada tujuan untuk memetakan dua pengguna untuk uid yang sama
nux
1
Satu-satunya tujuan yang dapat saya pikirkan adalah memberikan UID nama pengguna kedua, alias. Tetapi ini adalah perilaku yang tidak terdefinisi dan tidak direkomendasikan. Sungguh ini adalah situasi yang tidak diinginkan: Anda lebih baik dengan hubungan 1: 1 antara nama pengguna dan UID
Josh
Itulah mengapa saya mengajukan pertanyaan ini, saya perlu tahu, saya merasa ini cara yang membingungkan
nux
Ini membingungkan; itu sebabnya kamu tidak harus melakukannya. Itu tidak memiliki "tujuan", itu lebih merupakan penyalahgunaan /etc/passwdfile. Tetapi tidak ada cara untuk mencegah Anda melakukan ini. Apakah itu masuk akal?
Josh
1
seorang pengguna menyebutkan bahwa tujuannya adalah untuk memiliki 2 login menunjuk ke izin sistem file yang identik.
nux
5

Alasan bahwa ini diizinkan hari ini, adalah hanya karena sistem tidak mencegahnya.

Jika ini berubah, maka itu akan merusak sistem di mana admin telah menggunakan fitur ini, (lihat contoh Terdon). Jadi itu tidak pernah berubah, dan saya pikir itu tidak akan pernah terjadi.

Awalnya hanya ada file sandi dan grup, dan mereka melayani tujuan mereka. tidak ada perintah adduser , tidak ada addgroup , file-file itu diedit oleh root menggunakan vi atau ed.

Ada beberapa kebiasaan!

Untuk mengingat id pengguna berikutnya yang akan digunakan, admin biasa memiliki pengguna khusus sebagai baris terakhir yang memiliki nama pengguna !(karena !nama pengguna tidak valid) dan entri itu digunakan untuk menyimpan pengguna berikutnya identitas pengguna. Saya akui, tapi itu berhasil! Jadi mengapa membuat perut jadi lebih rumit, mirip dengan perkembangan tangkas hari ini.

Ada kelemahan yang diketahui. Yang utama, bahwa itu harus dapat dibaca dunia, sehingga utilitas seperti lsbisa memetakan user-id => name. Ini berarti siapa pun dapat melihat kata sandi terenkripsi semua orang, dan semua pengguna dan id di sistem.

Beberapa sistem Unix mulai memperkenalkan beberapa skrip shell adduser addgroup, seringkali ini diabaikan, karena mereka tidak konsisten antara Unix, jadi kebanyakan orang hanya melanjutkan dengan pengeditan manual.

Butuh beberapa tahun, sebelum shadowfile kata sandi ditemukan, ini memberikan sedikit keamanan, dengan menyembunyikan kata sandi yang dienkripsi. Sekali lagi, cukup banyak kompleksitas ditambahkan, tetapi masih cukup kasar dan sederhana. Utilitas useradddan groupadddiperkenalkan, yang disimpan shadowdan shadow-diperbarui. Untuk memulainya, ini sering kali adalah pembungkus skrip shell sederhana di sekitar utilitas adduser / addgroup milik vendor . Sekali lagi itu cukup untuk terus berjalan.

Jaringan komputer tumbuh dewasa, orang-orang bekerja pada beberapa sekaligus untuk menyelesaikan pekerjaan, sehingga admin passwd/groupfile menjadi mimpi buruk, terutama dengan NFS, sehingga datang Yellow Pages juga dikenal sebagai NIS untuk meringankan beban.

Sudah jelas sekarang bahwa sesuatu yang sedikit lebih fleksibel diperlukan, dan PAM diciptakan. Jadi jika Anda benar-benar canggih dan menginginkan sistem otentikasi terpusat, aman, unik-id'ed, semua lonceng dan peluit Anda akan memanggil ke server pusat untuk otentikasi, mungkin server Radius, server LDAP atau direktori aktif.

Dunia telah tumbuh dewasa. Tetapi file passwd / group / shadow masih tetap bagi kita pengguna / pengembang / lab yang lebih kecil. Kami masih tidak benar-benar membutuhkan semua lonceng dan peluit. Saya kira filosofi telah berubah sedikit sekarang menjadi, "Jika Anda akan membuatnya lebih baik, Anda tidak akan menggunakannya sama sekali" , jadi jangan khawatir tentang hal itu.

Inilah mengapa saya tidak berpikir file passwd sederhana akan pernah berubah. Tidak ada gunanya lagi, dan itu hanya bagus untuk Raspberry Pi £ 30 dengan suhu pemantauan 2 mungkin 3 pengguna, dan feed twitter. OK, Anda hanya perlu sedikit berhati-hati dengan id-pengguna Anda jika Anda ingin mereka unik, dan tidak ada yang mencegah penggila membungkus useradd dalam sebuah skrip yang pertama-tama memilih id unik berikutnya dari database (file) untuk menetapkan id unik, jika itu yang Anda inginkan. Bagaimanapun, ini adalah open source.

X Tian
sumber
2

The /etc/passwdFile hanya memetakan username simbolik ke userID nyata. Jika Anda sengaja membuat dua nama simbolis yang memetakan ke satu userID maka itu akan membiarkan Anda.

Itu tidak berarti itu ide yang baik untuk benar-benar melakukannya. Beberapa orang mungkin telah menemukan kasus penggunaan yang sangat spesifik di mana mereka dapat memanfaatkan fitur ini, tetapi secara umum Anda tidak boleh melakukannya.

Linux (dan UNIX lainnya) berpendapat bahwa administrator tahu apa yang mereka lakukan. Jika Anda menyuruhnya melakukan sesuatu yang bodoh maka itu adalah kesalahan Anda sendiri, seperti halnya jika Anda menyuruh mobil Anda mengemudi di atas tebing, Anda tidak dapat pergi ke pabrik dan bertanya mengapa mobil itu memungkinkan Anda melakukan ini.

pengguna253158
sumber
mengapa itu disebut sebagai bug?
nux
1

Ada pengidentifikasi bahwa sistem operasi mengharapkan untuk menjadi unik, tetapi mereka digunakan untuk melacak perangkat keras. Pengetahuan bahwa IDentifier Unik Semesta tertentu berhubungan dengan hard drive yang berisi file sistem dapat membantunya untuk terus beroperasi jika konfigurasi perangkat keras berubah. Microsoft menyebut ID pastaiers Global Unik ini dan menggunakannya untuk melacak semua perangkat lunak Windows. Ironisnya, akronim ini dipilih dengan buruk.

Dari perspektif OS, sebagian besar pengidentifikasi pengguna dan grup mengubah jumlah hingga mengubah antarmuka luarnya. Itu bisa berfungsi secara normal meskipun tabrakan; terutama yang dibutuhkan oleh pengguna sistem dan grup adalah bahwa mereka ada. Tidak dapat mengetahui apa yang dibutuhkan pengguna. Dalam situasi seperti ini, filosofi Unix adalah bahwa OS harus mengasumsikan administrator tahu apa yang mereka lakukan, dan harus membantu mereka melakukannya dengan cepat.

pengguna130144
sumber
0

Saya menemukan beberapa bukti yang mendukung jawaban @ andybalholm.

Dari APUE , §8.15:

Setiap proses dapat mengetahui ID pengguna dan ID grup yang nyata dan efektif. Namun, terkadang, kami ingin mengetahui nama login pengguna yang menjalankan program. Kita dapat memanggil getpwuid( getuid()), tetapi bagaimana jika satu pengguna memiliki beberapa nama login, masing-masing dengan ID pengguna yang sama? ( Seseorang mungkin memiliki beberapa entri dalam file kata sandi dengan ID pengguna yang sama untuk memiliki shell login yang berbeda untuk setiap entri .) Sistem biasanya melacak nama yang kami masuki (Bagian 6.8), dan getloginfungsinya menyediakan cara untuk mengambil nama login itu.

....

Diberi nama login, kita kemudian dapat menggunakannya untuk mencari pengguna di file kata sandi - untuk menentukan shell login, misalnya — menggunakan getpwnam.

Btw, saya ingin tahu apakah seseorang dapat beralih ke shell lain saat login.

Rick
sumber