Di atas panggung lagi pemenang kompetisi internasional SSH dan sudo. Di bawah bimbingan Direktori Konduktor Aktif Yang Terhormat

Secara historis, hak sudo diatur oleh konten file dari /etc/sudoers.d dan visudo , dan otorisasi kunci dilakukan menggunakan ~ / .ssh / berwenang_keys . Namun, dengan pertumbuhan infrastruktur, ada keinginan untuk mengelola hak-hak ini secara terpusat. Hingga saat ini, mungkin ada beberapa solusi:

  • Sistem Manajemen Konfigurasi - Koki , Boneka , Anonim , Garam
  • Direktori Aktif + sssd
  • Berbagai distorsi dalam bentuk skrip dan pengeditan manual file

Menurut pendapat subjektif saya, pilihan terbaik untuk manajemen terpusat masih sekelompok Active Directory + sssd . Keuntungan dari pendekatan ini adalah:

  • Benar-benar direktori pengguna terpusat tunggal.
  • Mendistribusikan hak sudo adalah tentang menambahkan pengguna ke grup keamanan tertentu.
  • Dalam kasus berbagai sistem Linux, menjadi perlu untuk memperkenalkan pemeriksaan tambahan untuk menentukan OS ketika menggunakan sistem konfigurasi.

Suite Today akan didedikasikan untuk bundel Active Directory + sssd untuk mengelola hak sudo dan menyimpan kunci ssh dalam satu repositori.
Jadi, para penonton membeku dalam keheningan yang tegang, sang konduktor mengangkat tongkatnya, orkestra bersiap.
Ayo pergi.

Diberikan:

  • Domain direktori aktif testopf.local pada Windows Server 2012 R2.
  • Tuan rumah Linux menjalankan Centos 7
  • Otorisasi yang dikonfigurasi menggunakan sssd

Kedua solusi membuat perubahan pada skema Direktori Aktif , jadi kami memeriksa semuanya pada lingkungan pengujian dan hanya kemudian membuat perubahan pada infrastruktur kerja. Saya ingin mencatat - semua perubahan berbasis poin dan, pada kenyataannya, hanya menambahkan atribut dan kelas yang diperlukan.

Langkah 1: kelola peran sudo melalui Active Directory .


Untuk memperpanjang skema Active Directory, Anda perlu mengunduh rilis sudo terbaru - 1.8.27 hari ini. Buka paket, salin file schema.ActiveDirectory dari direktori ./doc ke pengontrol domain. Dari baris perintah dengan hak administrator dari direktori tempat Anda menyalin file, jalankan:

ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(Jangan lupa untuk mengganti nilai-nilai Anda)

Buka adsiedit.msc dan sambungkan ke konteks default:

Di root domain, buat unit sudoers . (Borjuis dengan keras kepala berpendapat bahwa dalam unit inilah daemon sssd mencari objek sudoRole . Namun, setelah mengaktifkan debug terperinci dan memeriksa log, terungkap bahwa pencarian dilakukan di seluruh pohon katalog.)

Buat objek pertama di unit milik kelas sudoRole . Nama dapat dipilih secara mutlak sewenang-wenang, karena hanya berfungsi untuk identifikasi yang mudah.

Di antara kemungkinan atribut yang tersedia dari ekstensi skema, yang utama adalah:

  • sudoCommand - Menentukan perintah mana yang diizinkan dijalankan pada host.
  • sudoHost - menentukan host mana yang digunakan untuk peran ini. Itu dapat diatur sebagai SEMUA , atau untuk host individu dengan nama. Dimungkinkan juga untuk menggunakan topeng.
  • sudoUser - menunjukkan pengguna mana yang diizinkan untuk mengeksekusi sudo .
    Jika grup keamanan ditentukan, tambahkan tanda "%" di awal nama. Jika ada spasi dalam nama grup, tidak ada yang perlu dikhawatirkan. Dilihat oleh log, mekanisme sssd mengambil tugas untuk melarikan diri dari ruang.


Gambar 1. objek sudoRole di unit sudoers di root direktori


Gambar 2. Keanggotaan dalam grup keamanan yang ditentukan dalam objek sudoRole.

Konfigurasi berikut dilakukan di sisi Linux.

Dalam file /etc/nsswitch.conf , tambahkan baris ke akhir file:

 sudoers: files sss 

Di file /etc/sssd/sssd.conf di bagian [sssd] , tambahkan sudo ke layanan

 cat /etc/sssd/sssd.conf | grep services services = nss, pam, sudo 

Setelah semua operasi, Anda perlu menghapus cache daemon sssd. Pembaruan otomatis dilakukan setiap 6 jam, tetapi mengapa kita harus menunggu begitu lama saat kita inginkan sekarang.

 sss_cache -E 

Sering terjadi bahwa membersihkan cache tidak membantu. Kemudian kami menghentikan layanan, membersihkan pangkalan, memulai layanan.

 service sssd stop rm -rf /var/lib/sss/db/* service sssd start 

Kami terhubung di bawah pengguna pertama dan memeriksa apakah itu dapat diakses dari bawah sudo:

 su user1 [user1@testsshad log]$ id uid=1109801141(user1) gid=1109800513(domain users) groups=1109800513(domain users),1109801132(admins_) [user1@testsshad log]$ sudo -l [sudo] password for user1: Matching Defaults entries for user1 on testsshad: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User user1 may run the following commands on testsshad: (root) /usr/bin/ls, /usr/bin/cat 

Kami melakukan hal yang sama dengan pengguna kedua kami:

 su user2 [user2@testsshad log]$ id uid=1109801142(user2) gid=1109800513(domain users) groups=1109800513(domain users),1109801138(sudo_root) [user2@testsshad log]$ sudo -l Matching Defaults entries for user2 on testsshad: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User user2 may run the following commands on testsshad: (root) ALL 

Pendekatan ini memungkinkan Anda untuk menentukan peran sudo secara terpusat untuk grup pengguna yang berbeda.

Menyimpan dan menggunakan kunci ssh di Active Directory


Dengan sedikit perluasan skema, dimungkinkan untuk menyimpan kunci ssh di atribut pengguna Active Directory dan menggunakannya untuk otorisasi pada host Linux.

Otorisasi melalui sssd harus dikonfigurasi.

Tambahkan atribut yang diinginkan menggunakan skrip PowerShell.

AddsshPublicKeyAttribute.ps1
Function-AttributeID Baru {
$ Awalan = "1.2.840.113556.1.8000.2554"
$ GUID = [System.Guid] :: NewGuid (). ToString ()
$ Parts = @ ()
$ Parts + = [UInt64] :: Parse ($ guid.SubString (0.4), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (4,4), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (9,4), "AllowHexSpecifier")
$ Parts + = [UInt64] :: Parse ($ guid.SubString (14,4), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (19,4), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (24.6), “AllowHexSpecifier”)
$ Parts + = [UInt64] :: Parse ($ guid.SubString (30.6), “AllowHexSpecifier”)
$ oid = [String] :: Format ("{0}. {1}. {2}. {3}. {4}. {5}. {6}. {7}", $ awalan, $ Parts [ 0],
$ Bagian [1], $ Bagian [2], $ Bagian [3], $ Bagian [4], $ Bagian [5], $ Bagian [6])
$ oid
}
$ schemaPath = (Get-ADRootDSE) .schemaNamingContext
$ oid = New-AttributeID
$ atribut = @ {
lDAPDisplayName = 'sshPublicKey';
attributeId = $ oid;
oMSyntax = 22;
attributeSyntax = "2.5.5.5";
isSingleValued = $ true;
adminDescription = 'Kunci Publik Pengguna untuk login SSH';
}

New-ADObject -Name sshPublicKey -Type atributSchema -Path $ schemapath -OtherAttributes $ atribut
$ userSchema = get-adobject -SearchBase $ schemapath -Filter 'name -eq "user"'
$ userSchema | Set-ADObject -Add @ {mayContain = 'sshPublicKey'}

Setelah menambahkan atribut, restart Layanan Domain Direktori Aktif.
Kami memberikan kepada pengguna Direktori Aktif. Dengan cara apa pun yang nyaman bagi Anda, kami menghasilkan pasangan kunci untuk koneksi ssh.

Luncurkan PuttyGen, klik tombol "Hasilkan" dan dengan panik klik pada mouse di dalam area kosong.

Setelah menyelesaikan proses, kita dapat menyimpan kunci publik dan pribadi, mengisi kunci publik di atribut pengguna Active Directory dan menikmati prosesnya. Namun, kunci publik harus digunakan dari jendela " Kunci publik untuk menempel ke file OpenSSH yang diotorisasi: ".



Tambahkan kunci ke atribut pengguna.

Opsi 1 - GUI:



Opsi 2 - PowerShell:

get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}

Jadi, yang kita miliki saat ini: pengguna dengan atribut sshPublicKey diisi, klien Putty dikonfigurasi untuk otorisasi utama. Masih ada satu poin kecil, bagaimana membuat daemon sshd menarik kunci publik yang kita butuhkan dari atribut pengguna. Sebuah skrip kecil yang ditemukan di ruang terbuka Internet borjuis berhasil mengatasi ini.

 cat /usr/local/bin/fetchSSHKeysFromLDAP #!/bin/sh ldapsearch -h testmdt.testopf.local -xb "dc=testopf,dc=local" '(sAMAccountName='"${1%@*}"')' -D Administrator@testopf.local -w superSecretPassword 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp' 

Kami menetapkan 0500 izin untuk root di atasnya.

 chmod 0500 /usr/local/bin/fetchSSHKeysFromLDAP 

Dalam contoh ini, akun administrator digunakan untuk mengikat ke direktori. Dalam kondisi pertempuran harus ada akun terpisah dengan set hak minimum.

Saya pribadi sangat bingung dengan momen kata sandi dalam bentuknya yang murni di dalam skrip, terlepas dari hak yang ditentukan.

Opsi Solusi:

  • Saya menyimpan kata sandi dalam file terpisah:

     echo -n Supersecretpassword > /usr/local/etc/secretpass 
  • Saya mengatur izin pada file 0500 untuk root

     chmod 0500 /usr/local/etc/secretpass 
  • Saya mengubah parameter startup ldapsearch: -w parameter superSecretPassword diubah menjadi -y / usr / local / etc / secretpass

Kunci terakhir dalam rangkaian hari ini adalah mengedit sshd_config

 cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe" PubkeyAuthentication yes AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP AuthorizedKeysCommandUser root 

Akibatnya, kami mendapatkan urutan berikut dengan otentikasi kunci yang dikonfigurasi di klien ssh:

  1. Pengguna terhubung ke server, menunjukkan nama penggunanya.
  2. Daemon sshd, melalui skrip, menarik nilai kunci publik dari atribut pengguna di Active Directory dan mengotorisasi kunci.
  3. Daemon sssd selanjutnya mengotentikasi pengguna berdasarkan keanggotaan grup. Perhatian! Jika ini tidak dikonfigurasi, maka setiap pengguna domain akan memiliki akses ke host.
  4. Ketika sudo mencoba, daemon sssd mencari direktori Active Directory untuk peran. Jika ada peran, atribut dan keanggotaan pengguna grup diperiksa (jika sudoRoles dikonfigurasi untuk menggunakan grup pengguna)

Ringkasan


Dengan demikian, kunci disimpan dalam atribut pengguna Active Directory, izin sudo - demikian pula, akses ke host Linux oleh akun domain dilakukan dengan memeriksa keanggotaan dalam grup Active Directory.

Gelombang terakhir tongkat konduktor - dan aula membeku dalam keheningan yang terpesona.

Sumber yang digunakan secara tertulis:

Source: https://habr.com/ru/post/id449702/


All Articles