CyberFlow Logo CyberFlow 📚 Blog

runc - Container runtime analizi

✍️ Ahmet BİRKAN 📂 kali_tools_container_docker_guvenligi
runc - Container runtime analizi Giriş Giriş Günümüzde yazılım geliştirme süreçleri, sürekli entegrasyon ve sürekli dağıtım (CI/CD) uygulamaları ile daha hızlı…
runc - Container runtime analizi

runc - Container runtime analizi

Giriş

Giriş

Günümüzde yazılım geliştirme süreçleri, sürekli entegrasyon ve sürekli dağıtım (CI/CD) uygulamaları ile daha hızlı ve etkili hale gelmiştir. Bu bağlamda, konteyner teknolojileri, uygulamaların taşınabilirliğini ve ölçeklenebilirliğini artırarak modern yazılım sistemlerinin temel bir parçası olmuştur. Konteynerlerin doğasındaki mevcudiyet, sistemlerin daha hafif, daha hızlı ve daha güvenli bir şekilde çalışmasını sağlar. İşte burada "runc" devreye girer.

runc Nedir?

runc, konteynerlerin çalıştırılması için kullanılan bir araçtır ve Open Container Initiative (OCI) tarafından tanımlanan standartlara dayanmaktadır. runc, konteynerlerin oluşturulmasını ve yönetilmesini sağlayan bir "runtime" yani çalışma zamanı bileşenidir. Çeşitli platformlarda ve sistemlerde konteynerlerin yönetilmesi için gerekli temel altyapıyı sunar.

Neden Önemi Var?

Konteyner teknolojisi, uygulamaların bağımsız birimler olarak çalışmasını ve dağıtılmasını sağlar. runc, bu teknolojinin bir parçası olarak, geliştiricilere ve sistem yöneticilerine aşağıdaki avantajları sunar:

  1. Taşınabilirlik: runc, OCI standartlarına göre tasarlandığı için, aynı konteyner görüntüleri farklı ortamlarda kolayca çalıştırılabilir. Bu, uygulamaların geliştirilmesi, testi ve dağıtımında büyük kolaylık sağlar.

  2. Performans: runc, konteynerlerin işletim sisteminin çekirdek seviyesinde çalışmasını sağlar. Bu, uygulamaların daha verimli ve daha az kaynak kullanarak çalışmasına olanak tanır.

  3. Hafiflik: runc, geleneksel sanal makinelerden daha az kaynak tüketir. Bu, daha fazla uygulamanın daha az donanım ile aynı anda çalışmasına olanak tanır.

Nerelerde Kullanılır?

runc, genellikle devops süreçlerinde, mikro hizmet mimarilerinde ve bulut tabanlı uygulamalarda yaygın bir şekilde kullanılır. Örneğin, Kubernetes gibi konteyner orkestrasyon sistemleri, konteynerleri otomatik olarak dağıtmak ve yönetmek için runc'ı kullanabilir.

Siber Güvenlik Açısından runc

Konteyner teknolojisinin yaygınlaşması ile birlikte, siber güvenlik tehditleri de bu alanda artış göstermiştir. runc, güvenli bir çalışma ortamı sağlamak üzere tasarlandı; ancak, zaafiyetler ve saldırı yüzeyleri de doğrudan bu teknolojinin uygulama şekliyle ilişkilidir. runc ile yapılandırılmış konteynerlerde güvenlik risklerini en aza indirmek için çeşitli en iyi uygulamalar ve yapılandırmalar mevcuttur.

Örneğin, konteynerleri çalıştırırken bazı temel güvenlik önlemleri almak gerekebilir:

# Bir örnek yapılandırma dosyası
securityContext:
  runAsUser: 1000
  fsGroup: 2000
  capabilities:
    drop: ["ALL"]

Yukarıdaki yapılandırma örneği, konteynerin daha güvenli bir şekilde çalışmasını sağlamak için alınabilecek önlemlerden sadece bir tanesidir.

Dolayısıyla, runc'ın anlaşıldığı ve uygun bir şekilde kullanıldığı bir ortam, sadece konteynerlerin verimliliğini artırmakla kalmaz, aynı zamanda sistem güvenliğini de ciddi şekilde iyileştirebilir.

Teknik Detay

runc Nedir?

runc, konteynerlerin çalıştırılması ve yönetilmesi için kullanılan bir runtime bileşenidir ve Open Container Initiative (OCI) standartlarına uygundur. Bu bileşen, konteynerlerin yaşam döngüsünü yönetmek için gerekli olan; başlatma, durdurma, güncelleme gibi işlemleri gerçekleştirir. runc, genellikle containerd gibi daha yüksek seviyeli araçlarla entegre olarak çalışır.

İşleyiş Mantığı

runc, Linux işletim sistemi üzerinde konteynerlerin izole bir şekilde çalışmasını sağlamak için birçok sistem bileşenini kullanır. Bu bileşenlerin başında cgroups (control groups), namespaces ve seccomp gelmektedir.

cgroups

cgroups, sistem kaynaklarını (CPU, bellek, disk I/O vb.) izlemek ve sınırlamak için kullanılan bir Linux özelliğidir. runc, bu özelliği kullanarak her bir konteynerin ihtiyaç duyduğu kaynakları sınırlar, böylece bir konteynerin diğer konteynerlerin performansını etkilemesini önler.

# cgroups kullanarak belleği sınırlama
echo 512M > /sys/fs/cgroup/memory/mycontainer/memory.limit_in_bytes

Namespaces

Namespaces, her bir konteynerin kendi izole edilmiş ortamında çalışmasını sağlar. runc, aşağıdaki namespace türlerini kullanır:

Bu izolasyon, konteynerlerin dış dünya ile iletişimini kontrol etmeye yardımcı olur. Örneğin, bir konteynerin kendi içerisinde çalışması için bir ağ namespace’i oluşturulabilir.

# Ağ namespace oluşturma
ip netns add mynamespace

Seccomp

Seccomp, sistem çağrılarını filtreleyen bir güvenlik mekanizmasıdır. runc, konteynerlerin sadece gerekli sistem çağrılarını yapmasına izin verir. Bu, potansiyel saldırı yüzeyini azaltır.

{
  "defaultAction": "SCMP_ACT_ERRNO",
  "syscalls": [
    {
      "names": ["fork", "execve"],
      "action": "SCMP_ACT_ALLOW"
    }
  ]
}

Teknik Bileşenler ve Yöntemler

runc, konteynerlerin yönetiminde aşağıdaki bileşenlere ihtiyaç duyar:

Dikkat Edilmesi Gereken Noktalar

Konteynerlerle ilgili güvenlik, performans ve yönetim stratejileri belirlerken aşağıdaki noktalar göz önünde bulundurulmalıdır:

Sonuç

runc, konteynerlerin yönetiminde kritik bir rol oynamaktadır. Linux’un sunduğu teknolojileri kullanarak, izole ve güvenli bir çalışma ortamı oluşturur. cgroups, namespaces ve seccomp gibi bileşenler ile runc, modern uygulamaların çalışmasını sağlayan güçlü bir araçtır. Bu bileşenlerin her birinin doğru bir şekilde yapılandırılması, konteynerlerin güvenliği ve performansı açısından hayati önem taşır.

İleri Seviye

runc ile İleri Seviye Container Runtime Analizi

Giriş

Container'lar, modern uygulama geliştirme paradigmasında önemli bir yer tutmaktadır. runc, Linux tabanlı container'ların oluşturulması ve yönetilmesi için kullanılan bir araçtır. Bu bölümde, runc üzerinden container runtime analizi yapma yöntemlerine ve güvenlik değerlendirmelerine odaklanacağız.

runc ile Analiz Yapma

runc, temel olarak Open Container Initiative (OCI) standardına dayalı olarak çalışan bir container runtime'dır. Özellikle güvenlik odaklı bir sızma testi yaparken, runc'nin sunduğu temel özellikleri anlamak hayati önem taşır.

Container'lar, genellikle bir uygulamanın bağımlılıklarını izole etmek için kullanılır. Ancak, çoğu zaman bu container'lar içindeki zafiyetler saldırganlar için kapılar açabilir. Runc'nin çalışma mantığını analiz ederek, bu zafiyetleri tespit etmek mümkündür.

runc'nin Temelleri

runc, bir container'ı başlatırken temel olarak bir "cgroup" ve "namespace" yapısının oluşturulmasını sağlar. Bu yapıların analizi, sızma testi süreçlerinde kritik öneme sahiptir.

Bir container'ı başlatmak için kullanılacak komut şöyle olabilir:

runc run example-container

Bu komutla birlikte, example-container içeriklerini içeren bir container başlatılmış olur. Kullanıcı tarafından tanımlanan yapılandırma dosyası, bu container'ın kaynak sınırlamalarını ve diğer ayarlarını içerir.

Sızma Testi Stratejileri

  1. Configuration File Analysis (Yapılandırma Dosyası Analizi): runc ile oluşturulan yapılandırma dosyasında dikkat edilmesi gereken noktalar:

    • capabilities ayarları: Hangi yetenekleri içerdiğini ve fazla yetenek kullanımlarını kontrol edin.
    • rootfs: Konteynerin kök dosya sisteminin bozulup bozulmadığını inceleyin.

    Örnek bir yapılandırma dosyası:

    {
        "ociVersion": "1.0.2",
        "process": {
            "user": {
                "uid": 0,
                "gid": 0
            },
            "args": ["sleep", "1000"],
            "env": [],
            "cwd": "/",
            "capabilities": {
                "bounding": ["CAP_SYS_ADMIN"],
                "effective": ["CAP_SYS_ADMIN"],
                "inheritable": ["CAP_SYS_ADMIN"],
                "permitted": ["CAP_SYS_ADMIN"],
                "ambient": []
            }
        },
        "root": {
            "path": "rootfs",
            "readonly": false
        },
        "linux": {
            "resources": {
                "memory": {
                    "limit": 524288000
                }
            }
        }
    }
    
  2. Namespace Isolation (Namespace İzolasyonu): Container'lar, izole bir çalışma alanı sağlamak amacıyla çeşitli namespace'ler kullanır. Her namespace türünün kendi güvenlik açığı potansiyeli vardır. Mesela PID namespace kullanılarak başka bir root process üzerinde kontrol sağlanabilir.

    Terminalde mevcut namespace'leri görüntülemek için:

    lsns
    

Uzman İpuçları

Sonuç

runc ve container yönetimi, güvenlik araştırmacıları için geniş bir analiz alanı sunar. Bu içerikte, runc üzerinden container runtime analizi yapma yöntemlerini ve potansiyel zafiyetleri inceledik. Kullanıcı dostu bir ortam sağlamakla birlikte, runc'nin sağladığı geniş yetenekler, aynı zamanda dikkatli bir yaklaşım gerektirir. Genellikle bir container runtime'ı kullanırken, sistem kaynaklarını ve güvenliği sürekli göz önünde bulundurmalısınız.