PowerShell Kimlik Bilgilerini JSON'da Depolama
Bazen sırf ne olacağını görmek için PowerShell'de bir şeyler yapıyorum. Bu, yeni cmdlet'ler ve teknikler hakkında bilgi edinmenin harika bir yoludur. Bazen bu deneyler yararlı sonuçlara yol açar. Bazen de öğretim araçları haline gelebilirler. Elbette sonuç her iki amaca da hizmet edebilir ve bugün kimlik bilgilerini bir JSON dosyasında saklamayı incelerken buna karar vermeniz gerekebilir.
PowerShell'in ilk günlerinden bu yana, komut dosyalarınızdaki sabit kodlama kimlik bilgilerinin tehlikelerini anlattık. Bir parolaya ihtiyacınız varsa, parolayı sormanız veya bir kimlik bilgisi nesnesini kabul etmek için PowerShell aracınızı yazmanız gerekir. Ancak bir süreci otomatikleştirmeniz VE alternatif veya belirli bir kimlik bilgisi kullanmanız gereken durumlar olabilir. Bir yaklaşım, bir kimlik bilgisini güvenli bir şekilde saklamak için cliXML cmdlet'lerini kullanmaktır.
$secure = ConvertTo-SecureString -String 'P@$$w0rd' -AsPlainText -Force
$cred = New-Object -typename PSCredential -ArgumentList @('company\admin',$secure)
$cred | Export-clixml c:\work\admin.xml
Şifreyi görebilmeniz için manuel olarak bir kimlik bilgisi oluşturdum. Export-Clixml'i kullandığınızda PowerShell, güvenli dize parolasını otomatik olarak dönüştürür.
Parola, yerel kripto API'leri kullanılarak şifrelenir. İşlemi yalnızca aynı bilgisayarda tersine çevirebilirsiniz.
$in = Import-clixml C:\work\admin.xml
Dosyayı başka bir bilgisayara kopyalayıp işlemi denersem hata alıyorum.
Ayrıca içe aktarmanın yerel olarak işe yaradığını kanıtlamak için:
Peki ya herhangi bir nedenle saklanan kimlik bilgisi için bir JSON dosyası kullanmak isterseniz? Nasıl yapardın?
PowerShell, dönüşüm adımlarını otomatik olarak eklemez ancak bunları kendiniz uygulamak o kadar da zor değildir. Öncelikle kullanıcı adını seçmeniz ve şifreyi güvenli bir dizeden geri dönüştürmeniz gerekir.
$cred | Select Username,@{Name="Password";Expression = { $_.password | ConvertFrom-SecureString }}
Bu nesne artık Convertto-Json'a aktarılabilir:
Bu cmdlet bir dosya oluşturmadığından Out-File veya Set-Content'e aktarmanız gerekecektir.
Json'un XML'e göre küçük bir avantajı, dosya yükünün daha küçük olmasıdır.
Ama şimdi onu hayata döndürmeye bakalım. İlk önce içeriği JSON'dan dönüştürün.
$in = Get-Content -Path c:\work\admin.json | ConvertFrom-Json
Daha sonra parola değerini tekrar güvenli bir dizeye dönüştürün.
$secure = ConvertTo-SecureString $in.Password -ErrorAction Stop
Son olarak bir kimlik bilgisi nesnesi oluşturun.
$newcred = New-Object -TypeName PSCredential $in.username,$secure
Tüm süreç aslında o kadar da hantal değil ama devam ettim ve PSJsonCredential adında bir PowerShell modülü oluşturdum.
Modülde dışa aktarma, içe aktarma ve raporlamaya yönelik komutlar bulunur.
Export-PSCredentialToJson -Path c:\work\admin.json -Credential $cred
Bu komut ayrıca mevcut bir dosyanın üzerine yazılmasını önlemek için -NoClobber parametresine sahiptir. Ayrıca kim, nerede ve ne zaman olduğunu belirtmek için bir meta veri özelliği de ekledim. Bu verileri Get-PSCredentialFromJson ile alabilirsiniz:
İçe aktarma komutu meta verileri yok sayabilir.
$admin = Import-PSCredentialFromJson -Path C:\work\admin.json
Denemek veya koda daha yakından bakmak isterseniz modülü PowerShell galerisinde yayınladım.
Başta da belirttiğim gibi bu modül pek çığır açıcı değildir ve pratik bir kullanımı olmayabilir. Ancak en azından kimlik bilgileri ve JSON dosyalarıyla çalışmaya ilişkin bazı bilgiler sunabilir.
Kimlik bilgilerinin *herhangi bir* biçimde diskte saklanmasının potansiyel bir güvenlik riski olduğunu ve bazı kuruluşlarda buna izin verilmeyebileceğini unutmayın. Bu tekniklerin şirketinizde ne kadar uygun olduğunu belirlemek size kalmıştır.
Umarım, özellikle de pratik bir uygulama bulursanız, ne düşündüğünüzü bana bildirirsiniz.