1. Önsöz
Güvenlik Destekli Linux (SELinux), Linux çekirdek modülü ve Linux'un bir güvenlik alt sistemidir.
SELinux öncelikle NSA tarafından geliştirildi. Linux çekirdekleri 2.6 ve üzeri sürümler zaten SELinux modüllerini entegre ediyor.
SELinux çok karmaşık ve öğrenmesi zor olan birçok kavramsal unsur içeriyor. Birçok Linux sistem yöneticisi, SELinux'u sorun buldukları için kapatmıştır.
SELinux'u ustalaşıp doğru kullanırsanız, bence tüm sistem temelde "yok edilemez" bir noktaya ulaşabilir (mutlak bir güvenlik olmadığını unutmayın).
SELinux'un temel kavramlarını ve basit yapılandırma yöntemlerini ustalaştırmak, her Linux sistem yöneticisi için zorunlu bir derstir.
Bu makale CentOS 7.4.1708 üzerinden dayanmaktadır.
Bu makale tamamen kişisel bir öğrenme deneyimi paylaşımı ve alışverişidir, hatalar kaçınılmazdır, sadece referans amaçlıdır! Bir hata bulursanız lütfen belirtin, çok teşekkürler!
2. SELinux'un rolü ve izin yönetimi mekanizması
2.1 SELinux'un rolü
SELinux'un ana işlevi, sistemdeki hizmet süreçlerinin erişebileceği kaynakları en aza indirmektir (en az ayrıcalık ilkesi).
Root olarak çalışan bir ağ servisinde 0day güvenlik açığı varsa, hackerlar bu açığı kullanarak sunucunuzda istediklerini root olarak yapabilirler. Korkutucu değil mi?
SELinux bu sorunu çözmek için burada.
2.2 DAC
SELinux kullanmayan bir işletim sisteminde, bir kaynağa erişilemeyeceğini belirleyen faktör, bir kaynağın ilgili kullanıcının (okuma, yazma, yürütme) izinlerine sahip olup olmadığıdır.
Bu kaynağa erişim süreci yukarıdaki koşulları karşıladığı sürece erişilebilir.
En ölümcül sorun, root kullanıcılarının herhangi bir düzenlemeye tabi olmaması ve sistemdeki herhangi bir kaynağa kısıtlama olmadan erişilebilmesidir.
Bu izin yönetim mekanizmasının ana gövdesi, otonom erişim kontrolü (DAC) olarak da bilinen kullanıcıdır.
2.3 MAC
SELinux kullanan bir işletim sisteminde, bir kaynağa erişilemeyeceğini belirleyen faktörler sadece yukarıdaki faktörler değil, aynı zamanda her süreç türünün belirli bir kaynak türüne erişimi olup olmadığıdır.
Bu şekilde, bir süreç root olarak çalışıyor olsa bile, bir kaynağa erişim izni verip vermemeye karar vermeden önce işlem türünü ve erişilebilecek kaynak türlerini belirlemek gerekir. Sürecin aktif alanı da minimuma indirilebilir.
Root olarak çalışan bir servis süreci bile genellikle sadece ihtiyaç duyduğu kaynaklara erişebiliyor. Bir program savunmasız olsa bile, etkinin kapsamı erişmesine izin verilen kaynaklarla sınırlıdır. Güvenlik büyük ölçüde artırıldı.
Bu izin yönetim mekanizmasının ana gövdesi, zorunlu erişim kontrolü (MAC) olarak da bilinen süreçtir.
MAC iki şekilde ayrılır; biri Kategori Güvenliği (MCS) modu, diğeri ise Çok Seviyeli Güvenlik (MLS) modu olarak adlandırılır.
Aşağıdaki eylemler MCS modundadır.
2.4 DAC ve MAC'in karşılaştırması
İşte bunu göstermek için bir fotoğraf.
Gördüğünüz gibi, DAC modunda, ilgili dizin ilgili kullanıcının izinlerine sahip olduğu sürece erişilebilir. MAC modunda, süreçlerin erişebileceği dizin yelpazesiyle de sınırlıdır.
3. SELinux'un temel kavramları
3.1 Konu
Bu tamamen bir süreçle eşitlenebilir.
Not: Anlaşılması kolaylığı için, aksi belirtilmedikçe, süreç aşağıda ana gövde olarak kabul edilir.
3.2 Nesne
Müdür tarafından erişilen kaynaklar. Dosyalar, dizinler, portlar, cihazlar vb. olabilir.
Not: Anlaşılması kolaylığı için, aksi belirtilmedikçe, aşağıdaki belgeler veya dizinler nesne olarak kabul edilir.
3.3 Pola ve Kural
Sistemde genellikle çok sayıda dosya ve süreç bulunur ve zaman ve ek yük tasarrufu için genellikle sadece belirli süreçleri seçici olarak düzenliyoruz.
Ve hangi süreçlerin düzenlenmesi gerektiği ve nasıl kontrol edileceği politika tarafından belirlenir.
Bir poliçede birden fazla kural vardır. Bazı kurallar gerektiğinde etkinleştirilebilir veya devre dışı bırakılabilir (bundan sonra Boolean kuralları olarak adlandırılır).
Kurallar modüler ve genişletilebilir. Yeni bir uygulama kurulurken, uygulama yeni modüller ekleyerek kurallar ekleyebilir. Kullanıcılar ayrıca kuralları manuel olarak ekleyebilir veya çıkarabilirler.
CentOS 7 sisteminde üç politika seti vardır:
1. hedefli: Çoğu ağ servis sürecini kontrol eder. Bu, sistemin varsayılan olarak kullandığı politikadır (aşağıdakilerin hepsi kullanılmıştır).
2. Asgari: Hedeflenen sisteme göre yalnızca seçilmiş ağ servis süreçleri düzenlenir. Genelde hayır.
3. MLS: Çok seviyeli güvenlik koruması. Tüm süreçleri düzenleyin. Bu en katı politikadır ve yapılandırması çok zordur. Genellikle, güvenlik için çok yüksek gereksinimler olmadıkça kullanılmaz.
Politikalar /etc/selinux/config içinde ayarlanabilir.
3.4 Güvenlik Bağlamı
Güvenlik bağlamı, SELinux'un merkezinde yer alıyor.
Güvenlik bağlamını "süreç güvenliği bağlamı" ve "belge güvenliği bağlamı" olarak bölüyorum.
Bir Süreç Güvenliği Bağlamı genellikle birden fazla Belge Güvenliği Bağlamına karşılık gelir.
Yalnızca iki aracın güvenlik bağlamı karşılık geldiğinde bir süreç dosyaya erişebilir. Yazışmaları, poliçedeki kurallara göre belirlenir.
Dosya güvenlik bağlamı, dosyanın nerede oluşturulduğu ve onu oluşturan sürece göre belirlenir. Ve sistemin varsayılan değerler seti vardır ve kullanıcılar da varsayılan değerleri ayarlayabilir.
Sadece dosyaları taşımak, dosyalarınızın güvenlik bağlamını değiştirmediğini unutmamak önemlidir.
Güvenlik bağlamının yapısı ve anlamı
Güvenlik bağlamında dört alan bulunur ve bunlar iki noktayla ayrılır. Şekiller gibi: system_u:object_r:admin_home_t:s0.
3.5 SELinux Çalışma Modu
SELinux'un üç çalışma modu vardır:
1. zorunluluk: Zorunlu mod. SELinux kurallarının ihlalleri engellenecek ve kayıtlara kaydedilecektir.
2. İzin verici: Tolerans modu. SELinux kural ihlalleri yalnızca kayıtlara kaydedilir. Genelde hata ayıklama için.
3. devre dışı bırakın: SELinux'u kapatın.
SELinux çalışma modu /etc/selinux/config içinde ayarlanabilir.
Devre dışı bırakmaktan zorunlu veya izin vericiye geçmek istiyorsanız, sistemi yeniden başlatmanız gerekecek. Ve tam tersi.
Zorunlu ve İzin modları Setenforce 1|0 komutuyla hızlıca değiştirilebilir.
Sistem bir süredir SELinux kapalıyken çalışıyorsa, SELinux açıldıktan sonraki ilk yeniden başlatmanın daha yavaş olabileceğini belirtmek önemlidir. Çünkü sistem, diskteki dosyalar için güvenli bir bağlam yaratmak zorunda (yaklaşık 10 dakika yeniden başlattığımı ve cihazın öldüğünü düşündüğümü söyledim...... )。
SELinux kayıtları auditd.service yardımıyla kaydedilmeli, lütfen devre dışı bırakmayın.
3.6 SELinux İş Akışı
İşte bir fotoğraftan alıntı, çok fazla açıklama olmadan.
Not: Yukarıdaki güvenlik metni güvenlik bağlamına atıfta bulunur.
4. Temel SELinux işlemleri
4.1 Bir dosyanın veya dizinin güvenlik bağlamını sorgulama
Komut temel kullanımı
ls -z
Kullanım örnekleri
/etc/hostların güvenlik bağlamını sorgulayın.
ls -Z /etc/hosts
İdam sonuçları
-rw-r--r--. kök kök system_u:object_r:net_conf_t:s0 /etc/hosts
4.2 Sürecin güvenlik bağlamını sorgulama
Komut temel kullanımı
ps auxZ | grep -v grep | grep
Kullanım örnekleri
Nginx ile ilgili süreçlerin güvenlik bağlamını sorgulayın.
ps auxZ | grep -v grep | Grep Nginx
İdam sonuçları
system_u:system_r:httpd_t:s0 kök 7997 0.0 0.0 122784 2156 ? Ss 14:31 0:00 nginx: ana süreç /usr/sbin/nginx
system_u:system_r:httpd_t:s0 nginx 7998 0.0 0.0 125332 7560 ? S 14:31 0:00 nginx: işçi süreci
4.3 Bir dosyanın veya dizinin güvenlik bağlamını manuel olarak değiştirmek
Komut temel kullanımı
CHCON [...]
Seçenek fonksiyonu -u Güvenlik bağlamının kullanıcı alanını değiştir -r Güvenlik bağlamının rol alanını değiştir -t Güvenlik bağlamının tür alanını değiştir -l Güvenlik bağlamının seviye alanını değiştir --referans Belirlenen dosya veya dizinle tutarlı güvenlik bağlamını değiştir -R Özyinelemeli işlem -h Soft link'in güvenlik bağlamını değiştir (bu seçenek olmadan soft link'in ilgili dosyasını değiştir)
Kullanım örnekleri
Testin güvenlik bağlamını aaa_u:bbb_r:ccc_t:s0 olarak değiştirin.
chcon -u aaa_u -r bbb_r -t ccc_t test
4.4 Bir dosyanın veya dizinin güvenlik bağlamını varsayılan değerine geri döndür
Komut temel kullanımı
RestoreCon [seçenekler] [...]
Seçenek Fonksiyonu - V Baskı İşlemi Prosedürü - R Özyinelemeli İşlem
Kullanım örnekleri
Nginx sunucunuzun dizinine bazı web dosyaları ekledikten sonra, bu yeni dosyalar için doğru güvenlik bağlamını ayarlayın.
restorecon -R /usr/share/nginx/html/
4.5 Boolean kuralları ve sistemdeki durumları sorgulama
Komut temel kullanımı
getsebool -a
Komut ya tüm kuralları ya da sadece bir kuralı sorguladığı için, genellikle önce tüm kuralları sorgular, sonra grep ile filtreler.
Kullanım örnekleri
httpd ile ilgili Boolean kurallarını sorgulayın.
getsebool -a | grep httpd
İdam sonuçları
httpd_anon_write -->
httpd_builtin_scripting -->
httpd_can_check_spam -->
httpd_can_connect_ftp -->
#以下省略
4.6 Boolean kuralının Değiştirilmesi
Komut temel kullanımı
Setsebool [seçenek]
Seçenek fonksiyonu -P yeniden başlatma hâlâ geçerlidir
Kullanım örnekleri
httpd_anon_write kuralları açın.
setsebool -P httpd_anon_write on
4.7 Bir Dizin İçin Varsayılan Güvenlik Bağlamı Ekle
Komut temel kullanımı
semanage fcontext -a -t "(/.*)?"
Not: Bir dizinin veya dosyanın varsayılan güvenlik bağlamı, grep filtreleme ile birlikte semanage fcontext -l komutu kullanılarak görüntülenebilir.
Kullanım örnekleri
Nginx'e yeni bir site dizini /usr/share/nginx/html2 ekledikten sonra, orijinal dizinle aynı varsayılan güvenlik bağlamını ayarlamanız gerekir.
semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"
4.8 Belirli işlem türlerinin izin verdiği portları ekleyin
Komut temel kullanımı
semanage port -a -t -p
Not: Çeşitli hizmet türleri için izin verilen port numaraları, grep filtreleme ile semanage port -l komutu kullanılarak görüntülenebilir.
Kullanım örnekleri
Nginx için HTTP servisleri için 10080 portunu kullanmanız gerekir.
Semanage port -a -t http_port_t -p TCP 10080
5. SELinux hata analizi ve çözümü
5.1 SELinux Logs'u Anlama
SELinux etkinleştirildiğinde, birçok hizmetin bazı normal davranışları ihlal olarak kabul edilir (hem başlıkta hem de aşağıdaki hatalarda).
Şu anda, bunları analiz etmek ve çözmek için SELinux ihlal kayıtlarını kullanmamız gerekiyor.
SELinux ihlal kayıtları /var/log/audit/audit.log içinde kaydedilir.
/var/log/audit/audit.log 的内容大概是这样的。
type=LOGIN msg=audit(1507898701.391:515): pid=8523 uid=0 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=25 res=1
type=USER_START msg=audit(1507898701.421:516): pid=8523 uid=0 auid=0 ses=25 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_open grantors=pam_loginuid,pam_ keyinit,pam_limits,pam_systemd acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=başarı'
...
Dosya çok fazla içerik içeriyor ve SELinux hatalarıyla ilgisi olmayan birçok sistem denetim günlüğüyle karışmış. Analiz için sealert aracını kullanacağız (eğer komut komutunu bulamazsa, setroubleshoot paketini yükleyin).
5.2 Sealert ile hataları analiz et
Komut temel kullanımı
sealert -a /var/log/audit/audit.log
Komut yürütüldükten sonra, sistemin kayıtlardaki ihlalleri analiz etmek ve analiz raporu sunmak için biraz zaman ayırması gerekir. |