Kodun imzalandığından emin olmak için kontrol eden bir kabuk var mı?


19

Bu hafta PowerShell ile uğraşıyordum ve çalıştırılabilmeleri için komut dosyalarınızı imzalamanız gerektiğini keşfettim. Linux'ta bash betiklerinin çalıştırılmasını önlemeye ilişkin benzer bir güvenli işlev var mı?

Buna benzer tek işlevsellik, farkında olduğum SSH'nin belirli bir anahtar gerektirmesidir.


2
Bana imza atmak için geçici bir çözüm gibi geliyor. Windows'ta Linux'un şifrelerini imzalayan bir şifreleme paketi olup olmadığını bilmiyorum.
Wildcard

6
@ leeand00 Komut dosyası, bir yazılım paketinin özel bir örneğidir ve bu davayı açıklamak için hiçbir nokta göremiyorum.
Gilles 'SO- kötü olmayı bırak

2
En çok sevdiğim mekanizma, ChromeOS'un bunu yapma şeklidir - noexectek bir dm verity imzalı blok cihazında salt okunur bir bölümde işaretlenmemiş dosya sistemini koymaktır.
Charles Duffy

1
source.android.com/security/verifiedboot, Android'in bu (başlangıçta ChromeOS) özelliğini benimsemesinden bahsediyor.
Charles Duffy

1
Bash'ı komut satırı arabiriminde el ile yazılabilen bir grup komut olarak düşünebilirsiniz. İçeriği yine de komut satırına yazabildiğinizde komut dosyalarını kısıtlamanın anlamı nedir?
Ding-Yi Chen

Yanıtlar:


11

Kullanıcıların komut dosyalarını çalıştırma yeteneğini kilitliyorsanız işlevselliği sudokullanabilirsiniz digest.
Yürütülmeden önce sudoersdoğrulanacak bir komut dosyasının / yürütülebilir dosyanın karmasını belirleyebilirsiniz sudo. Bu nedenle, imzalama ile aynı olmasa da, komut dosyasının sudoers da değiştirilmeden en azından değiştirilmediğine dair temel bir garanti verir.

Komut adının önüne Digest_Spec eklenirse, komut yalnızca belirtilen SHA-2 özeti kullanılarak doğrulanabilirse başarıyla eşleşir. Bu, sudo'yu çağıran kullanıcının komuta veya üst dizinine yazma erişimine sahip olduğu durumlarda yararlı olabilir. Aşağıdaki özet biçimleri desteklenir: sha224, sha256, sha384 ve sha512. Dize, onaltılık veya base64 biçiminde belirtilebilir (base64 daha küçüktür). Openssl, shasum, sha224sum, sha256sum, sha384sum, sha512sum gibi onaltılık formatta SHA-2 sindirimleri üretebilen birkaç yardımcı program vardır.

http://www.sudo.ws/man/1.8.13/sudoers.man.html


SE Linux'u okuyana ve doğru yapana kadar bu beni tutacak.
leeand00

13

Evet ve hayır.

Linux yazılım dağıtımı, Windows yazılım dağıtımından biraz farklı çalışır. (Yerleşik olmayan) Linux dünyasında, yazılımı dağıtmanın birincil yöntemi bir dağıtımdır (Ubuntu, Debian, RHEL, Fedora, Arch, vb.). Tüm büyük dağıtımlar yaklaşık on yıldır paketlerini sistematik olarak imzalamaktadır.

Yazılım bağımsız olarak dağıtıldığında, yazılımlarını nasıl göndereceklerine karar vermek satıcıya bağlıdır. İyi satıcılar, büyük dağıtımlarla uyumlu tüm paket kaynaklarını sağlar (tüm Linux için birleşik bir dağıtım mekanizması yoktur: yazılım dağıtımı, dağıtımlar arasındaki ana ayrım noktalarından biridir) ve satıcının anahtarıyla imzalanır. Linux dağıtımları nadiren üçüncü taraf satıcılar için imza yetkisi olarak hareket eder (Canonical bunu Ubuntu ortaklarıyla yapar, ancak çok az sayıda satıcıyı kapsar) ve bence tüm büyük dağıtımlar TLS ortak anahtar altyapısı yerine PGP güven ağını kullanıyor. bir anahtara güvenmek isteyip istemediklerini anlamak kullanıcıya bağlıdır.

Yerel bir yürütülebilir dosya, bir veri dosyası veya birden çok dosyadan oluşan yazılım paketlerinden tek bir komut dosyasından oluşan yazılım paketlerini belirleyen özel bir mekanizma yoktur. Bir yazılım paketini doğrulamak, bir komut dosyasını çalıştırmaktan tamamen dik bir endişe kaynağı olduğundan, yaygın bir komut dosyası yorumlayıcısında herhangi bir imza doğrulaması yerleşik değildir.

Bence Windows, kökeni olan dosyalara açıklama ekler ve kaynağı "yerel" yerine "indirilen" bir dosyayı çalıştırmak için kullanıcı onayı gerektirir. Linux gerçekten benzer bir mekanizmaya sahip değil. En yakın şey yürütme iznidir: indirilen bir dosyanın yürütme izni yoktur, kullanıcının dosyayı açıkça etkinleştirmesi gerekir ( chmod +xkomut satırında veya bir dosya yöneticisinde eşdeğer eylem).


2
FWIW, bu PowerShell üstündeki (ilke ayarlarına göre) yalnızca imzalı komut dosyalarını yürütecek şekilde yapılandırılabilir ve bu ilke tüm komut dosyalarının imzalanması veya yalnızca "uzak kaynaklı" komut dosyalarının veya komut dosyalarının olmaması için yapılandırılabilir . En iyi anahtar yönetimi ve merkezi politika yönetimi ile bir AD ortamında çalışır. Bu olabilir :-) atlanabilir
Stephen Harris

@StephenHarris Eh evet bunu atlamak için ayarlarsanız ...
leeand00

@ leeand00 - Görünüşe göre base64 kodlaması da bir baypas olarak çalışıyor, ancak bunun PowerShell'in yeni sürümlerinde kapalı olup olmadığını bilmiyorum.
Stephen Harris

1
@ leeand00 - biraz eğlence için bkz. darkoperator.com/blog/2013/3/5/… :-) Temelde komut satırında parametre olarak base64 kodlu komut dosyasını geçirin :-) Sarmak için yeterince kolay!
Stephen Harris

2
SeLinux, dosyalara kökenleriyle açıklama ekler. Ana tesislerinden biridir.
loa_in_

10

Linux, dijital imzalara dayalı bash komut dosyalarının yürütülmesini sınırlama yeteneği sağlamaz.

İkili çalıştırılabilir dosyaları doğrulamak için bazı çalışmalar vardır. Bilgi için https://lwn.net/Articles/488906/ adresine bakın .


Bir hokey etrafında çalışma önermeksizin doğrudan cevap için oy verin.
user394

8

Tek kelimeyle, "hayır".

Linux, yürütülebilir dosyalar ve komut dosyaları arasında gerçekten bir ayrım yapmaz; #!başında girdi değerlendirmek çalıştırmak için ne programı çekirdek anlamanın bir yolu ama bir senaryo çalıştırılabilir tek yol değil.

Yani, örneğin, bir senaryom varsa

$ cat x
#!/bin/sh 
echo hello

Sonra bunu komutla çalıştırabilirim

$ ./x

Bu, çekirdeğin denemesine ve yürütmesine, yerini bulmasına #!ve /bin/sh xbunun yerine etkili bir şekilde çalışmasına neden olur .

Ancak ben de bu değişkenlerden herhangi birini çalıştırabilirsiniz:

$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x

ya da

. ./x

Çekirdek execkatmandaki imzalamayı zorunlu kılmaya çalışsa bile, bunu sadece yorumlayıcıyı komut dosyasıyla parametre olarak çalıştırarak atlayabiliriz.

Bu, imzalama kodunun yorumlayıcının içinde olması gerektiği anlamına gelir. Ve bir kullanıcının imzalama zorlama kodu olmadan kendi kabuk kopyasını derlemesini ne engeller ?

Bunun standart çözümü imzalama kullanmak değil, Zorunlu Erişim Kontrolleri (MAC) kullanmaktır SELinux. MAC sistemleri ile her kullanıcının tam olarak neyi çalıştırmasına ve katmanları geçişine izin verileceğini belirleyebilirsiniz. Örneğin, "normal kullanıcılar herhangi bir şeyi çalıştırabilir, ancak web sunucusu ve CGI işlemleri yalnızca /var/httpddizindeki öğelere erişebilir ; diğer her şey reddedilir" diyebilirsiniz .


1
This means that signing code would have to be in the interpreter itself. And what would stop a user from compiling their own copy of a shell without the signing enforcement code?Yürütme izin vermemek herhangi bir kullanıcı imzalama anahtarı yoksa, bunu yapacağını imzasız yürütülebilir. Bunun için zaten çeşitli * nix projeleri var.
alzee

2

Linux dağıtımlarında genellikle gnupg bulunur . Bana tüm istediğiniz gibi bağımsız bir komut dosyası karşı müstakil bir gpg imzasını kontrol basit bir bash sarıcı ve sadece kontrol başarılı olursa komut dosyasını çalıştırmak için ilerliyor gibi geliyor:

#!/bin/sh
gpgv2 $1.asc && bash "$@"

Bunun
sunmadığı

2

Hemen akla gelen karşıt soru, "Kullanıcıların yazdıkları programları çalıştırmasını neden engellemek istesiniz? "

  1. İlk başta kodu kimin yazdığını tespit etmek tam anlamıyla imkansızdır . Komut dosyasının sahibi, nereden geldiğine bakılmaksızın, dosyanın içeriğini gerçekte kim kaydetmişse odur. İmzayı zorunlu kılmak , bir onay iletişim kutusunun karmaşık bir yedeğidir: "Bunu yapmak istediğinizden emin misiniz?" Linux'ta bu sorunun bir kısmı imzalı paketlerle şeffaf bir şekilde çözülür ve kullanıcıların varsayılan olarak sınırlı erişime sahip olmasıyla azaltılır. Kullanıcının ayrıca başkalarının kodunu çalıştırmanın tehlikeli olabileceğini bilmesi beklenir *.
  2. Aynı şekilde, bir komut dosyasını imzalamak bir dosyayı kaydetmekten çok daha karmaşık bir işlemdir. En iyi durumda bu, kullanıcıdan bir belgeyi imzalamaya benzer bir işlem gerçekleştirdiğini fark etmesini ister ve devam etmeden önce söylediklerini incelemelidir. Büyük olasılıkla çok az bir seviyede kullanıcının betiği çalıştırmasına izin verilecek teknik yeterlilik sağlar . En kötü durumda, istediklerini çalıştırmak için uzun bir dizi çemberin içinden atlamaya istekli olduğunu gösterir . Linux * üzerinde teknik yeterlilik varsayılmıştır.
  3. İnsanların komut satırlarına bir dizi komut yazarken / yapıştırırken bariz bir şekilde kötü amaçlı kod algılamaları . Kopyalanacak ve yapıştırılacak düz metin parçacıkları genellikle düzgün bir şekilde haksız bir şey yapmak için gerekli komut dizilerinden daha küçüktür. Kullanıcı ayrıca her satırı dikkatlice kopyalayıp yapıştırabilir, ne olduğunu anlar. Bir komut dosyasıyla, kullanıcı koda hiç bakmamış olabilir. Bu, imzalı komut dosyalarının 12'nci kez yapıldıktan sonra çok yaygın bir telafi maliyetiyle faydalı bir uygulaması olabilir.

* Daha fazla insan Linux kullanmaya başladıkça, bu muhtemelen giderek daha az gerçek oluyor


1

Sistemlerin farklı şekilde gelişmesinin nedeni, Linux'un 'exec' dosya özniteliğine sahip olması ve Windows'un yürütülebilirliği belirlemek için dosya uzantılarını kullanmasıdır.

Windows'da kullanıcıyı varsayılan olarak gizlenecek olan ".exe", ".bat", ".scr" uzantılı bir dosya indirmesi için kandırmak kolaydır . Bu dosyaya çift tıklamak size arbitary code (yürütme kodu) yürütülmesini sağlar. Bu nedenle, bu riski azaltmak için geniş bir menşe izleme ve yürütülebilir / kod imzalama mekanizması oluşturulmuştur.

Linux'ta, kullanıcıya bir dosya alabilirsiniz, ancak 'exec' bitinin kolayca ayarlanmasını zorlayamazsınız. Ayrıca, tüm dosya sistemlerini 'noexec' yapmak mümkündür.

Her durumda yorumlayıcıyı çağırarak bir komut dosyasını açıkça çalıştırabilirsiniz. Hatta çalışma zamanında kabuk komut dosyaları oluşturabilir ve bunları "sh" olarak işaretleyebilir veya "sh -c" çalıştırabilirsiniz.


0

Özel olarak, birçok arşivleme programı içerilen dosyalarda yürütme bitini korumaz. Bu, keyfi yürütülebilir dosyaları çalıştırmayı imkansız hale getirir. Neredeyse.

Mesele şu ki, başka bir cevapta, yürütme biti eksikliğinin böyle bir komut dosyasını doğrudan geçmenizi engellemediğidir bash. Bu tür komut dosyalarının çoğununbash komut , shebang herhangi bir programı tercüman olarak belirtebilir. Bu, yürütülebilir semantiği görmezden gelmeye karar verirlerse uygun tercümanı çalıştırmak kullanıcıya bağlıdır.

Bu çok fazla olmasa da, bu sadece çekirdek ve kabuk ile * nix'lerde güvenilmeyen yürütülebilir dosyalar çalıştırmanın önlenmesini kapsar .

Yorumlardan birinde bahsettiğim gibi SeLinux, bir dizi kurala göre dosyaların kökenini izleyen başka bir koruma katmanı var . Bir kurulum SeLinux, örneğin, dosyayı kopyalayıp hareket ettirseniz bile, kökün internetten indirilen yürütülebilir bit kümesiyle yürütülebilir bir dosya çalıştırmasına izin vermez. Bu tür dosyalar, sorunuzda bahsettiğinizin aksine, yalnızca imzayı kontrol edecek başka bir ikili dosyadan çalıştırılabilecek bir kural eklenebilir.

Sonuçta, bu genellikle önceden kurulmuş araçların konfigürasyonu ile ilgilidir ve cevap evettir .


birçok arşivleme programı içerdiği dosyalarda yürütme bitini korumaz. Aslında, arşivleme için kullanmak istediğinizde bu bir handikaptır. Neyse tar gelmez biraz yürütmek korumak.
pjc50

tar -p Kaynak
loa_in_

-p, --preserve-permissions, --same-permissionsdosya izinleri hakkında bilgi almak anlamına gelir (süper kullanıcı için varsayılan)
loa_in_

Hayır, -p'ye ihtiyacınız YOKTUR. Man sayfasının ne dediğini görüyorum, ama olan bu değil. touch permtest; chmod +x permtest; tar cf permtest.tar.gz permtest; rm permtest; tar xf permtest.tar.gz; ls -l permtest- burada yürütülebilir ve ben kök değilim.
domen

O zaman cevabımı geliştirmeye çalışacağım.
loa_in_
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.