Güvenli yazılım tedarik zinciri için en iyi yöntemler
Açık Kaynak her yerdedir. Birçok özel kod tabanında ve topluluk projesinde yer alır. Kuruluşlar ve bireyler için, bugünkü soru açık kaynak kodu kullanıp kullanmadığınız değil, hangi açık kaynak kodunu kullandığınız ve ne kadar kullandığınızdır.
Yazılım tedarik zincirinizde neler olduğunun farkında değilseniz bağımlılıklarınızdan birindeki yukarı akış güvenlik açığı önemli olabilir ve bu da sizi ve müşterilerinizi olası bir tehlikeye karşı savunmasız hale getirir. Bu belgede , "yazılım tedarik zinciri" teriminin ne anlama geldiğini, neden önemli olduğunu ve en iyi yöntemlerle projenizin tedarik zincirinin güvenliğini sağlamaya nasıl yardımcı olabileceğinizi ayrıntılı olarak ele alacaktır.
Bağımlılıklar
Yazılım tedarik zinciri terimi, yazılımınıza giren her şeyi ve nereden geldiğini ifade etmek için kullanılır. Yazılım tedarik zincirinizin bağımlı olduğu bağımlılıklarınız ve özellikleridir. Bağımlılık, yazılımınızın çalışması için gerekendir. Kod, ikili dosyalar veya diğer bileşenler olabilir ve depo veya paket yöneticisi gibi nereden geldikleri.
Kodu kimin yazdığı, ne zaman katkıda bulunduğu, güvenlik sorunları, bilinen güvenlik açıkları, desteklenen sürümler, lisans bilgileri ve işlemin herhangi bir noktasında ona dokunan hemen hemen her şey için nasıl gözden geçirildiği dahildir.
Tedarik zinciriniz, derleme ve paketleme betikleriniz veya uygulamanızın güvendiği altyapıyı çalıştıran yazılım gibi yığınınızın tek bir uygulamanın ötesindeki diğer bölümlerini de kapsar.
Güvenlik Açıkları
Günümüzde yazılım bağımlılıkları çok kapsamlıdır. Projelerinizin, kendi yazmanız gerekmeyen işlevler için yüzlerce açık kaynak bağımlılığı kullanması oldukça yaygındır. Bu, uygulamanızın çoğunun yazmadığınız koddan oluştuğu anlamına gelebilir.
Üçüncü taraf veya açık kaynak bağımlılıklarınızdaki olası güvenlik açıkları, büyük olasılıkla yazdığınız kod kadar sıkı bir şekilde denetleyemeyeceğiniz bağımlılıklardır ve bu da tedarik zincirinizde olası güvenlik riskleri oluşturabilir.
Bu bağımlılıklardan birinin güvenlik açığı varsa, sizin de bir güvenlik açığınız olabilir. Bağımlılıklarınızdan biri farkında bile olmadan değişebildiğinden bu korkutucu olabilir. Bugün bir bağımlılıkta bir güvenlik açığı olsa da, ancak bu güvenlik açığından yararlanılamaz olsa bile, gelecekte bu güvenlik açığından yararlanılabilir.
Binlerce açık kaynak geliştirici ve kitaplık yazarının çalışmalarından yararlanabilmek, binlerce yabancının üretim kodunuzla doğrudan katkıda bulunabileceği anlamına gelir. Ürününüz, yazılım tedarik zinciriniz aracılığıyla düzeltilmemiş güvenlik açıklarından, masum hatalardan ve hatta bağımlılıklara karşı kötü amaçlı saldırılardan etkilenir.
Tedarik zincirinin tehlikeye atılmasına neden olan riskler
Tedarik zincirinin geleneksel tanımı üretimden gelir; bir şeyler yapmak ve tedarik etmek için gereken süreçler zinciridir. Planlamayı, malzeme tedarikini, üretimi ve perakendeyi içerir. Bir yazılım tedarik zinciri benzerdir, ancak malzemeler yerine koddur. Üretim yerine geliştirmedir. Kod, yerden kazmak yerine tedarikçilerden, ticari veya açık kaynak kaynaklanır ve genel olarak açık kaynak kodu depolardan gelir. Bir depodan kod eklemek, ürününüzün bu koda bağımlı olduğu anlamına gelir.
Yazılım tedarik zinciri saldırısının bir örneği, kötü amaçlı kod bir bağımlılığına bilerek eklendiğinde, kodu kurbanlarına dağıtmak için söz konusu bağımlılığın tedarik zincirini kullanarak oluşur. Tedarik zinciri saldırıları gerçek. Doğrudan yeni katkıda bulunan olarak kötü amaçlı kod eklemekten, başkalarını fark etmeden katkıda bulunanın hesabını devralmaya, hatta bağımlılığın resmi bir parçası olmayan yazılımları dağıtmak için imzalama anahtarını tehlikeye atmaya kadar birçok tedarik zincirine saldırmanın birçok yöntemi vardır.
Yazılım tedarik zinciri saldırısı nadiren son hedefin içindedir, bunun yerine bir saldırganın kötü amaçlı yazılım eklemesi veya gelecekteki erişim için bir arka kapı sağlaması için bir fırsat başlangıcıdır.
Eşleşmeyen yazılım
Günümüzde açık kaynak kullanımı önemlidir ve yakın zamanda yavaşlayaması beklenmemektedir. Açık kaynak yazılım kullanmayı bırakmayacağımız göz önüne alındığında, tedarik zinciri güvenliği tehdidi eşleşmeyen yazılımdır. Bunu bilerek, projenizin bağımlılığının bir güvenlik açığına sahip olması riskini nasıl giderebilirsiniz?
- Ortamınızda ne olduğunu bilmek. Bu, güvenlik açıkları veya lisanslama kısıtlamaları gibi bu bağımlılıkların risklerini anlamak için bağımlılıklarınızı ve geçişli bağımlılıkları keşfetmeyi gerektirir.
- Bağımlılıklarınızı yönetin. Yeni bir güvenlik açığı bulunduğunda etkilenip etkilenmeyeceğini belirlemeniz ve etkileniyorsa en son sürüme ve kullanılabilir güvenlik yaması güncelleştirmeniz gerekir. Bu, özellikle yeni bağımlılıklar getiren veya eski bağımlılıkları düzenli olarak denetleen değişiklikleri gözden geçirmek için önemlidir.
- Tedarik zincirinizi izleyin. Bu, bağımlılıklarınızı yönetmek için sahip olduğunuz denetimleri denetleyerek gerçekleştirilir. Bu, bağımlılıklarınız için karşılanması gereken daha kısıtlayıcı koşulları zorlamanıza yardımcı olur.
NuGet ve GitHub tarafından sunulan ve projenizdeki olası riskleri ele almak için kullanabileceğiniz çeşitli araç ve teknikleri ele alacağız.
Ortamınızda ne olduğunu öğrenme
Bilinen güvenlik açıklarına sahip paketler
📦 Paket Tüketicisi | 📦🖊 Paket Yazarı
.NET 8 ve Visual Studio 17.8, geri yükleme sırasında bilinen güvenlik açıklarına sahip doğrudan paketler hakkında uyarı veren NuGetAudit'i ekledi. .NET 9 ve Visual Studio 17.12, geçişli paketler hakkında da uyarmak için varsayılanı değiştirdi.
NuGetAudit bilinen bir güvenlik açığı veritabanı sağlamak için bir kaynak gerektirir, bu nedenle paket kaynağı olarak nuget.org kullanmıyorsanız, bunu denetim kaynağı olarak eklemeniz gerekir.
NuGet sizi uyardığı sırada güvenlik açığı genel olarak bilinir. Saldırganlar, uygulamalarına düzeltme eki uygulamamış hedeflere yönelik saldırılar geliştirmek için bu genel açıklamayı kullanabilir. Bu nedenle, projenizin kullandığı bir paketin bilinen bir güvenlik açığı olduğuna ilişkin bir uyarı aldığınızda, hızlı bir şekilde işlem yapmanız gerekir.
NuGet bağımlılık grafiği
📦 Paket Tüketicisi
Doğrudan ilgili proje dosyasına bakarak projenizdeki NuGet bağımlılıklarınızı görüntüleyebilirsiniz.
Bu genellikle iki yerden birinde bulunur:
packages.config
– Proje kökünde bulunur.<PackageReference>
– Proje dosyasında bulunur.
NuGet bağımlılıklarınızı yönetmek için hangi yöntemi kullandığınıza bağlı olarak, bağımlılıklarınızı doğrudan Çözüm Gezgini veya NuGet Paket Yöneticisi'de görüntülemek için Visual Studio'yu da kullanabilirsiniz.
CLI ortamlarında komutunu kullanarak dotnet list package
projenizin veya çözümünüzün bağımlılıklarını listeleyebilirsiniz.
Geçişli paketlerin dotnet nuget why
(projeniz tarafından doğrudan başvurulmayan paketler) projenizin paket grafiğine neden dahil edildiğini anlamak için komutunu da kullanabilirsiniz.
NuGet bağımlılıklarını yönetme hakkında daha fazla bilgi için aşağıdaki belgelere bakın.
GitHub bağımlılık grafı
📦 Paket Tüketicisi | 📦🖊 Paket Yazarı
Projenizin bağımlı olduğu paketleri ve buna bağlı depoları görmek için GitHub'ın bağımlılık grafiğini kullanabilirsiniz. Bu, bağımlılıklarında algılanan güvenlik açıklarını görmenize yardımcı olabilir.
GitHub depo bağımlılıkları hakkında daha fazla bilgi için aşağıdaki belgelere bakın.
Bağımlılık sürümleri
📦 Paket Tüketicisi | 📦🖊 Paket Yazarı
Güvenli bir bağımlılık tedarik zinciri sağlamak için, tüm bağımlılıklarınızın ve araçlarınızın düzenli olarak en son kararlı sürüme güncelleştirildiğinden emin olmak istersiniz. Bu sürümler genellikle bilinen güvenlik açıklarına yönelik en son işlevleri ve güvenlik düzeltme eklerini içerir. Bağımlılıklarınız, bağımlı olduğunuz kodu, kullandığınız ikili dosyaları, kullandığınız araçları ve diğer bileşenleri içerebilir. Bu şunları içerebilir:
Bağımlılıklarınızı yönetme
NuGet kullanım dışı ve savunmasız bağımlılıklar
📦 Paket Tüketicisi | 📦🖊 Paket Yazarı
Projenizde veya çözümünüzde sahip olabileceğiniz bilinen kullanım dışı veya güvenlik açığı olan bağımlılıkları listelemek için dotnet CLI'yi kullanabilirsiniz.
komutunu dotnet list package --deprecated
kullanabilir veya dotnet list package --vulnerable
bilinen kullanımdan kaldırmaların veya güvenlik açıklarının listesini sağlayabilirsiniz.
NuGetAudit, bilinen güvenlik açığı bağımlılıkları hakkında sizi uyarabilir ve bir kaynak bir güvenlik açığı veritabanı sağladığında varsayılan olarak etkinleştirilir.
GitHub güvenlik açığı olan bağımlılıklar
📦 Paket Tüketicisi | 📦🖊 Paket Yazarı
Projeniz GitHub'da barındırılıyorsa, projenizdeki güvenlik açıklarını ve hataları bulmak için GitHub Security'den yararlanabilirsiniz ve Dependabot, kod tabanınızda bir çekme isteği açarak bunları düzeltir.
Savunmasız bağımlılıkları kullanılmadan önce yakalamak, "Sola Kaydır" hareketinin bir hedefidir. Bağımlılıklarınız hakkında lisans, geçişli bağımlılıklar ve bağımlılıkların yaşı gibi bilgilere sahip olmak tam olarak bunu yapmanıza yardımcı olur.
Dependabot uyarıları ve güvenlik güncelleştirmeleri hakkında daha fazla bilgi için aşağıdaki belgelere bakın.
NuGet akışları
📦 Paket Tüketicisi
Güvendiğiniz paket kaynaklarını kullanın. Birden çok genel ve özel NuGet kaynak akışı kullanılırken, akışlardan herhangi birinden bir paket indirilebilir. Derlemenizin tahmin edilebilir ve Bağımlılık Karışıklığı gibi bilinen saldırılara karşı güvenli olduğundan emin olmak için paketlerinizin hangi akışlardan geldiğini bilmek en iyi uygulamadır. Koruma için yukarı akış özelliklerine sahip tek bir akış veya özel akış kullanabilirsiniz.
Paket akışlarınızın güvenliğini sağlama hakkında daha fazla bilgi için bkz . Özel Paket Akışlarını Kullanırken Riski Azaltmanın 3 Yolu.
Özel akış kullanırken, kimlik bilgilerini yönetmek için en iyi güvenlik yöntemlerine bakın.
İstemci güven ilkeleri
📦 Paket Tüketicisi
Oturum açmak için kullandığınız paketlerin kullanılmasını istediğiniz ilkeler vardır. Bu, bir paket yazarına, yazar imzalı olduğu sürece güvenmenize veya NuGet.org tarafından imzalanan depoya ait belirli bir kullanıcı veya hesaba aitse bir pakete güvenmenize olanak tanır.
İstemci güven ilkelerini yapılandırmak için aşağıdaki belgelere bakın.
Dosyaları kilitleme
📦 Paket Tüketicisi
Kilit dosyaları paketinizin içeriğinin karması depolar. Yüklemek istediğiniz paketin içerik karması kilit dosyasıyla eşleşiyorsa, paket yinelenebilirliğini sağlar.
Kilit dosyalarını etkinleştirmek için aşağıdaki belgelere bakın.
Paket Kaynağı eşlemesi
📦 Paket Tüketicisi
Paket Kaynağı Eşlemesi, çözümünüzdeki her paketin nuget.config dosyanızda hangi kaynaktan geri yüklenmesi gerektiğini merkezi olarak bildirmenize olanak tanır.
Paket kaynağı eşlemesini etkinleştirmek için aşağıdaki belgelere bakın.
Güvenli bilgisayarlar
Dizin izinleri
📦 Paket Tüketicisi
Windows ve Mac'te ve bazı Linux dağıtımlarında, kullanıcı hesabı giriş dizinleri varsayılan olarak özeldir. Ancak bazı Linux dağıtımları, kullanıcı dizinlerini varsayılan olarak aynı bilgisayardaki diğer hesaplar tarafından okunabilir hale getirir. Ayrıca, NuGet'in genel paketler klasörünü ve HTTP önbelleğini varsayılan olmayan konumlara yönlendirmek için birden çok yapılandırma seçeneği vardır. Çözümler, projeler ve depolar da kullanıcının giriş dizini dışında oluşturulabilir.
nuget.org üzerinde olmayan paketler kullanıyorsanız, bilgisayardaki başka bir hesap NuGet'in genel paketlerini veya HTTP önbellek dizinlerini veya projenin derleme çıkış dizinini okuyabilirse, bu paketler bu paketlere erişimi olmaması gereken kişilere açıklanabilir.
Linux'ta nuget.config dotnet nuget update source
dosya izinlerini yalnızca dosya sahibi tarafından okunabilir olacak şekilde değiştirir.
Ancak, nuget.config dosyasını başka bir şekilde düzenlerseniz ve dosya diğer hesapların dosyayı okuyabileceği bir konumdaysa, paket kaynağı URL'si veya paket kaynağı kimlik bilgileri hakkında bilgilerin açığa çıkması olabilir.
Herhangi bir nuget.config dosyasının aynı bilgisayarın diğer kullanıcıları tarafından okunamayacağından emin olmalısınız.
İndirmeler dizinindeki çözümler
📦 Paket Tüketicisi
İndirilenler dizininizdeki çözümler veya projeler üzerinde çalışıyorsanız ek özen gösterilmelidir. NuGet birden çok yapılandırma dosyasından ayarlar biriktirir ve MSBuild genellikle directory.build.props, Directory.NuGet.props, Directory.Build.targets ve diğer dosyaları herhangi bir üst dizinden doğrudan dosya sistemi köküne aktarır.
web tarayıcılarının dosyaları internetten indireceği varsayılan konum olduğundan, indirmeler klasörünün ek riski vardır
Derleme Aracıları
📦 Paket Tüketicisi
Her derlemeden sonra ilk duruma sıfırlanmayan derleme aracılarının (CI aracıları) dikkate alınması gereken birden çok risk vardır.
Kimlik bilgilerini yönetmenin güvenli yolları hakkında bilgi edinmek için, kimliği doğrulanmış akışlardan paketleri kullanma belgelerine bakın.
NuGet'in verileri depolayan dizinleri değiştirme hakkında bilgi edinmek için genel paketleri, önbelleği ve geçici klasörleri yönetme belgelerine bakın. Bu dizinler, CI aracısının her derlemeden sonra temizleyebilecekleri bir dizine yapılandırılmalıdır.
Projeniz tarafından kullanılan tüm paketlerin projenizin derleme çıktı dizininde bırakılabileceğini unutmayın. Projeniz kimliği doğrulanmış kaynaklardan gelen paketleri kullanıyorsa, aynı CI aracısının diğer kullanıcıları paket derlemelerine yetkisiz erişim elde edebilir. Bu nedenle, derleme başarısız olduğunda veya iptal edildiğinde bile derlemenizin sonunda deponuzu temizlemeniz gerekir.
Tedarik zincirinizi izleme
GitHub gizli dizi taraması
📦🖊 Paket Yazarı
GitHub, yanlışlıkla işlenen gizli dizilerin sahte kullanımlarını önlemek için NuGet API anahtarları için depoları tarar.
Gizli dizi tarama hakkında daha fazla bilgi edinmek için bkz . Gizli dizi tarama hakkında.
Paket İmzalama Yazma
📦🖊 Paket Yazarı
Yazar imzalama , bir paket yazarının kimliğini bir pakete damgalamasına ve tüketicinin sizden geldiğini doğrulamasına olanak tanır. Bu sizi içerik üzerinde oynanmaya karşı korur ve paketin kaynağı ve paketin orijinalliği hakkında tek bir gerçek kaynağı görevi görür. İstemci güven ilkeleriyle birleştirildiğinde, paketin belirli bir yazardan geldiğini doğrulayabilirsiniz.
Bir paketi imzalamayı yazmak için bkz . Paketi imzalama.
Yeniden Üretilebilir Derlemeler
📦🖊 Paket Yazarı
Yeniden üretilebilir derlemeler, her derlemede bayt için aynı olan ikili dosyalar oluşturur ve bir paket tüketicisinin ikili dosyayı doğrudan yeniden oluşturmasını ve derleme ortamının gizliliğinin ihlal edilmediğini doğrulamasını sağlayan kaynak kod bağlantıları ve derleyici meta verileri içerir.
Yeniden üretilebilir derlemeler hakkında daha fazla bilgi edinmek için bkz . Kaynak Bağlantı ile Paket Oluşturma ve Yeniden Üretilebilir Derleme Doğrulama belirtimi.
İki Öğeli Kimlik Doğrulaması (2FA)
📦🖊 Paket Yazarı
nuget.org'da her hesapta 2FA etkindir. Bu, GitHub hesabınızda veya NuGet.org hesabınızda oturum açarken ek bir güvenlik katmanı ekler.
Paketleme kimlik ön eki ayırma
📦🖊 Paket Yazarı
Paketlerinizin kimliğini korumak için, paket kimliği ön ekiniz belirtilen ölçütlere uygun şekilde düşerse eşleşen bir sahibi ilişkilendirmek için ilgili ad alanınızla bir paket kimliği ön eki ayırabilirsiniz.
Kimlik ön eklerini ayırma hakkında bilgi edinmek için bkz . Paket Kimliği ön eki ayırma.
Güvenlik açığı olan bir paketi kullanımdan kaldırma ve listeden çıkarma
📦🖊 Paket Yazarı
Yazdığınız bir pakette bir güvenlik açığı olduğunu fark ettiğinizde .NET paketi ekosistemini korumak için paketi kullanımdan kaldırıp listeden çıkararak paket arayan kullanıcılardan gizlenmesi için en iyisini yapın. Kullanım dışı bırakılmış ve listelenmemiş bir paket kullanıyorsanız, paketi kullanmaktan kaçınmanız gerekir.
Bir paketi kullanımdan kaldırmayı ve listeden kaldırmayı öğrenmek için paketleri kullanım dışı bırakma ve listeden çıkarma ile ilgili aşağıdaki belgelere bakın.
Ayrıca bilinen bilgileri GitHub Advisories Database'e bildirmeyi de göz önünde bulundurun.
Özet
Yazılım tedarik zinciriniz, kodunuzun içine giren veya kodu etkileyen her şeydir. Tedarik zinciri risklerinin gerçek olmasına ve popülerliğinin artmasına rağmen, bunlar hala nadirdir; bu nedenle yapabileceğiniz en önemli şey, bağımlılıklarınızın farkında olarak tedarik zincirinizi korumak, bağımlılıklarınızı yönetmek ve tedarik zincirinizi izlemektir.
NuGet ve GitHub'ın tedarik zincirinizi görüntüleme, yönetme ve izleme konusunda daha etkili olmak için bugün kullanabileceğiniz çeşitli yöntemler hakkında bilgi edindiniz.
Dünyanın yazılımının güvenliğini sağlama hakkında daha fazla bilgi için bkz . Octoverse 2020 Güvenlik Raporu'nun Durumu.