Sıradan kullanıcılara sudo vim erişimi sağlamak neden riskli?


30

Yeni bir kullanıcı oluşturmak ve ona erişim izni vermek istiyorum. Özel olarak, sudo vimhttpd.conf dosyasını kullanmasını ve düzenlemesini istiyorum . Bunu sudo'larda yazdım:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Ancak bunun riskli olabileceğini duydum. Bu neden sorunlu? Sorun ne kadar ciddi?


16
Birincisi, komutunuz, kullanıcının bilgisayardaki tüm dosyalara okuma ve yazma erişimi sağlayacaktır. Bir kez girildiğinde vim, kullanıcı istediği herhangi bir dosyayı açabilir ve yazabilir.
John1024,

4
Bir kenara, erişmesi gereken tüm kullanıcıları eklemek için yeni bir grup oluşturabilirsiniz /etc/httpd/confs/httpd.conf. Sonra chgrp [OPTION] GROUPNAME FILEgrup sahipliğini değiştirmek için kullanın /etc/httpd/confs/httpd.conf. groupadd vimportantYeni grubu oluşturmak ve chgrp -v vimportant /etc/httpd/confs/httpd.confgrup sahipliğini değiştirmek gibi bir şey . yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin

4
Sudo, cevaplarda belirtilen tüm sorunlar nedeniyle, kullanıcıların kendi ayrıcalıklarıyla çalışan bir düzenleyici ile dosyaları düzenlemelerine izin vermenin bir yolunu içerdiğini unutmayın. sudoersMan sayfasında "Güvenli düzenleme" konusuna bakın.
Michał Politowski

2
(Söylediklerimin doğru olup olmadığından emin değilim) sudoVim'e erişim verdiğiniz için, kullanıcı vim'i root olarak kullanabilecek. UNIX komutları (vim yılında çalıştırabileceğiniz Vim içinden Unix komutları nasıl çalıştırılır? Bir kullanıcı gibi şey yapmak mümkün olacaktır) bu yüzden useradd <myuser>, rm -rf /ya çok işlem yapabilirsiniz.
fedorqui, 11

6
Bu sormak için yanlış soru tür. Herhangi bir çeşit yüksek ayrıcalık vermeyi düşünürken, "Bunun neden tehlikeli olduğunu düşünmüyorsam, bunu yapacağım" diye düşünmek istemezsin. "Bunu yapmayacağım, kendime güvenli olduğunu kanıtlayamadığım sürece" diye düşünmek istiyorsun.
Nate Eldredge,

Yanıtlar:


60

Komut satırı argümanlarını kısıtlamanıza rağmen, kullanıcının root olarak çalıştığında rastgele bir dosyayı açmak, düzenlemek ve üzerine yazmak için vim kullanmasını engelleyen hiçbir şey yoktur .

Kullanıcı çalıştırabilir sudo vim /etc/httpd/conf/httpd.conf ve sonra

  • tüm bu metni düzenleme arabelleğinden temizle
  • daha sonra kolaylık kaynağı için mevcut bir dosya (gerekli olmasa da): örneğin sudo konfigürasyonu
    :r /etc/sudoers NOT: SELinux tarafından kısıtlanmadığı sürece, kullanıcı herhangi bir dosyayı bu şekilde okuyabilir !
  • kendine daha fazla sudo ayrıcalıkları ver user ALL=(ALL) NOPASSWD: ALL
  • eski yapılandırmanın üzerine yaz :w /etc/sudoers

Kullanıcılarınızın şimdi sisteminize erişebilmelerini, değiştirebilmelerini veya tahrip etmelerini sağlayabilecek düzinelerce benzer yolu hayal edebiliyorum.

Apache yapılandırmanızı yalnızca sudo log mesajlarında düzenlerken göreceğiniz için, dosyaların bu şekilde değiştirildiği bir denetim iziniz bile olmayacak. Bu, sudoherhangi bir editöre imtiyaz vermede güvenlik riskidir .

Bu, sudo root seviyesine komutları için tarve unzipgenellikle güvensiz olan haklar vermenin neden az ya da çok aynıdır , hiçbir şey arşivdeki sistem ikili dosyaları ya da sistem yapılandırma dosyalarının yerini almanızı engellemez.


Diğer birçok yorumcu sivri out sahip olarak ikinci bir risk, yani vimsağlayan kabuk kaçar size verir vim içinden bir alt kabuk başlayabilir, rasgele herhangi komutunu çalıştırmak . Sudo vim oturumunuzda bunlar root olarak çalışacaktır, örneğin shell escape:

  • :!/bin/bash size etkileşimli bir kök kabuğu verecek
  • :!/bin/rm -rf / barda iyi hikayeler yapacak.

Bunun yerine ne yapmalı?

sudoKullanıcıların sahip olmadıkları dosyaları güvenli bir şekilde düzenlemelerine izin vermek için hala kullanabilirsiniz .

Sudoers konfigürasyonunuzda, sudoeditbir kullanıcının düzenleyebileceği dosyalara tam (joker karakter) yol adını izleyen özel bir ayrılmış komut belirleyebilirsiniz:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

Kullanıcı daha sonra -esudo komut satırında anahtarı kullanabilir veya sudoeditkomutu kullanabilir :

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

Man sayfasında açıklandığı gibi :

-e (edit)Seçenek yerine bir komut çalıştırılmaz ve kullanıcı düzenlemek bir veya daha fazla dosya istediğinde, gösterir. Bir komut yerine, "sudoedit" dizesi güvenlik politikasına danışılırken kullanılır.
Kullanıcı politika tarafından yetkilendirilmişse, aşağıdaki adımlar uygulanır:

  • Geçici kopyalar, sahibine ayarlanan kullanıcıya ayarlanmış olarak düzenlenecek dosyalardan yapılır.
  • Politika tarafından belirtilen düzenleyici geçici dosyaları düzenlemek için çalıştırılır. Sudoers politikası, SUDO_EDITOR, VISUAL ve EDITOR ortam değişkenlerini kullanır (bu sırayla). SUDO_EDITOR, VISUAL veya EDITOR'dan hiçbiri ayarlanmadıysa, editör sudoers(5) seçeneğinde listelenen ilk program kullanılır.
  • Değiştirilmişlerse, geçici dosyalar orijinal konumlarına geri kopyalanır ve geçici sürümler kaldırılır.
    Belirtilen dosya mevcut değilse, oluşturulur.
    Sudo tarafından çalıştırılan çoğu komutun aksine, düzenleyicinin, çağrılan kullanıcının ortamı değiştirilmemiş olarak çalıştırıldığını unutmayın. Bir nedenden dolayı, sudo bir dosyayı düzenlenen sürümüyle güncelleyemiyorsa, kullanıcı bir uyarı alır ve düzenlenen kopya geçici bir dosyada kalır.

El sudoerskitabı ayrıca, ve seçenekleriyle birlikte kabuk kaçmalarına karşı nasıl sınırlı koruma sağlayabileceğinin bir bölümünü de içermektedir .RESRICTNOEXEC

restrict Kullanıcılara, isteğe bağlı komutlar çalıştırmalarını sağlayan komutlara erişim vermekten kaçının. Pek çok editör kabuk kaçmaların devre dışı bırakıldığı sınırlı bir moda sahiptir, ancak sudoedit editörleri sudo ile çalıştırmak için daha iyi bir çözümdür. Kabuk çıkışları sunan çok sayıda program nedeniyle, kullanıcıları sık sık çalıştırılamayan programlarla sınırlandırmak.

ve

noexec
Paylaşılan kütüphaneleri destekleyen birçok sistem, bir ortam değişkenini (genellikle LD_PRELOAD) alternatif bir paylaşılan kütüphaneye işaret ederek varsayılan kitaplık işlevlerini geçersiz kılma yeteneğine sahiptir. Bu tür sistemlerde, sudo tarafından çalıştırılan bir programın diğer programları yürütmesini önlemek için sudo'nun noexec işlevi kullanılabilir. Not ... ...
, bir komut için noexec etkinleştirmek kullanmak için NOEXECyukarıdaki Kullanıcı Şartname bölümünde belirtildiği gibi etiketi. İşte yine bu örnek:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Bu, kullanıcının aaron'un çalışmasını /usr/bin/moreve /usr/bin/vinoexec etkinken çalıştırılmasını sağlar . Bu, bu iki komutun başka komutları (kabuk gibi) yürütmesini engelleyecektir.


Bunu bilmiyordum sudo tarve sudo unzipsorunlara da neden oldum . Teşekkür ederim.
mi0pu

5
Güzel cevap Ayrıca vim içinden bir kabuğa kaçmayı da söylese daha iyi olurdu. Bir kabuğun içine girdikten sonra, herkes için ücretsizdir ve yine de günlüklerde görünecek olan tek şey kullanıcının Apache yapılandırma dosyanızı düzenlemesidir.
Bir CVn

2
Bunlara ek olarak? Vim kullanıyorsanız, korkunç bir şey yapabilirsin :!rm -rf /!
Wayne Werner,

1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcVe patlama. Tar'a kök erişimi bir güvenlik açığıdır.
Qix

1
@ MichaelKjörling beklediğim cevap bu oldu :sh, sonra patlama, kök kabuk
Creek

5

Bu yapılandırma, kullanıcının bu dosyayı düzenlemesini sağlar. Bunu yapmak için vimkök haklarına sahip bir editör başlatır .

Bir kez vimkomut başlatılır, kullanıcı o editör ile istediği her şeyi yapabilir. - Farklı bir dosyayı açabilir, hatta vim'den bir kabuk başlatabilir.

Bu nedenle kullanıcı artık rasgele dosyaları görüntüleyebilir ve düzenleyebilir ve sisteminizde rasgele komutlar çalıştırabilir.


"Bu yapılandırma tüm kullanıcıların bu dosyayı düzenlemesine izin verir" derken ne demek istiyorsunuz? "Kullanıcının" özel bir anlamı var mı?
mi0pu

Oops, dikkat etmedi. cevabı düzeltti.
michas 28:15

5

Güvenlik kilitleri

Örneğin gibi bazı programlar, less, vi, vimve more, diğer programlar bir kabuk komutu-Ne Kabuk Escape olarak bilinen veya komut yorumlayıcısı kaçmayı edilir çalıştırmak için izin verir. Bu durumlarda, NOEXECbazı programların diğer program ayrıcalıklarının yürütülmesine izin vermesini önlemek için kullanabilirsiniz . Örnek:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

Bu, kullanıcının vim ve daha fazlasını çalıştıran sistemdeki herhangi bir dosyayı düzenlemesini ya da daha fazla ve ayrıcalıklı bir şekilde görüntülemesini sağlar vim;

Önemli sudoolarak, bir programın ( STDOUT) çalıştırılmasının standart çıktısını kullanıcının ana dizini dışındaki dosyalara yönlendirmek gibi tehlikeli görevleri önleyebilecek birkaç güvenlik kilidi (varsayılan) içerir .

/etc/sudoersBir kullanıcının yetkilerle çalıştırabileceği bir dosyada tanımlanmışsa /usr/bin/vim, yani aşağıdakilere benzer bir şey:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudotanımlı normal kullanıcının /usr/bin/vimaşağıdaki şekillerde çalışmasına izin verir :

sudo /usr/bin/vim
sudo vim

Ancak aşağıdaki gibi vim çalıştırmak engellenebilir:

cd /usr/bin
sudo ./vim

2
Bunun bir cevap mı yoksa bir kes ve yapıştır hatası mı olması gerekiyor?
jasonwryan

1
Bunun çoğu soru ile ilgili değil.
Hauke,

4

Basit cevap:

Aşağıdaki bir Vim komutudur:

:shell

Şimdi bir kök kabuğuna sahipler.


1

Olası bir artımlı güvenlik iyileştirmesi, aşağıdakilerin yerine getirilmesi olabilir:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

ile

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

ve sonra kullanıcının sudo rvim /etc/httpd/confs/httpd.confyerine çalışmasını sağlayın.

Vim, -Z komut satırı seçeneğiyle veya programı rvim olarak başlatarak tetiklenen sınırlı bir modu destekler. Kısıtlı mod etkinleştirildiğinde "harici bir kabuk kullanan tüm komutlar devre dışı bırakılır". Bu yaklaşım, kullanıcının :split filediğer dosyaları açmak için bir ex komutu kullanmasını engellemez , ancak en azından kasten kötü niyetli kabuk komutları gibi engellemelidir :!rm -rf /.


1
Ne yazık ki, bu da% 100 güvensizdir. Eğer kullanıcı sistemde her şeye gücü kaçıracak şekilde / etc / sudoers dosyasını düzenleyebiliyorsa, herhangi bir komutu root olarak çalıştırabilir.
vurp0

0

Ben katılıyorum HBruijn cevabı kökü çok geniş aslında sistemini açar olarak vim çalışan ve sudoedit daha güvenli bir çözüm olacağını söyledi.

Fakat o zaman bile, sisteminiz hala açık olacaktır. En azından, kök ayrıcalıklarına sahip bazı apache işlemlerinin o yapılandırmaya göre başlatılacağını varsayar. Apache'yi harici programları yürütecek şekilde yapılandırmanın milyonlarca yolu vardır. Bir örnek olarak, CustomLog yönergesine yöneltici argümanını düşünün . El kitabı açıkça belirtir:

Güvenlik:

Bir program kullanılırsa, başlatan kullanıcı olarak çalıştırılır httpd. Sunucu root tarafından başlatılmışsa bu root olacaktır; Programın güvenli olduğundan emin olun.

Açıkçası, kullanıcılarınız config yazabiliyorsa, bu programı istedikleri herhangi bir şeye değiştirebilirler, örneğin onlara daha fazla izin vermek için bir kabuk betiği çalıştıran bir şey.

Bu nedenle, yakın zamanda yeteneklerini, apache'nin normal bir kullanıcı olarak çalışsa bile, özel bir limana bağlanma özel yeteneğini kazanabilecek şekilde kullanmanın bir yolunu hackledim. Bu şekilde, kullanıcılar yapılandırmayı düzenleyebilir ve hatta sunucuyu başlatabilir ve hala çoğunlukla güvendedir. Tek sorun, herhangi bir IP üzerindeki herhangi bir işlemi bağlayabilmeleridir. Belli bir güven derecesi vardır, çünkü sistem sshd'sini çökertmek için bir yol bulabilirler ve ardından root şifresini elde etmek için kendi versiyonlarını başlatırlar.


0

Bir bile sudoedit {.../whatever.conf}güvenlik riski olabileceği unutulmamalıdır.

Bir kabuk betiği oluşturun /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

ve bu betiği config dosyanızda arayın. Bu yaklaşımın çalıştığı birkaç örnek biliyorum:

samba -> log nt token komutu

log nt token command = /tmp/make_me_root.sh

syslog-ng -> program: Harici uygulamalara mesaj gönderme

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Sanırım bu listeyi sonsuz uzatabilir.

Tek yapmanız gereken hizmeti yeniden başlatmak. Elbette, bir kere kökünüz, izlerinizi bulanıklaştırmak için bu tür yapılandırma satırlarını geri alırsınız.


0

Tabii ki, hiç güvenli değil. Sudoedit önce dediği gibi, bunu yapmak için en kolay ve uygun bir yoldur.

Eklemek istediğim, vim'in bir kabuk başlatmasına izin vermesidir, bu nedenle, yalnızca herhangi bir sistem dosyasını düzenlemekle kalmaz, aynı zamanda bir kabuk başlatmasını ve istediği yerde yapmasını sağlar.

Sadece bir vim başlatmayı deneyin ve şunu yazın: sh

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.