web-dev-qa-db-ja.com

PowerShellを使用したNTFSアクセス許可の監査

NTFS形式のWindowsファイルサーバー上のさまざまなユーザーとユーザーグループのアクセス許可を監査できるようにする必要があるプロジェクトに取り組んでいます。 PowerShellを使用して、リモートファイル共有を再帰的に検索するか、サーバー自体で実行して、すべて、または指定したユーザーまたはユーザーグループに対して検出したすべての権限を出力するようにしたいと思います。目標は、これをユーザーとユーザーグループの定期的な監査に使用して、アクセス許可のクリープが発生していないこと、およびすべてのアクセス許可が異なるシステム管理者によって同じ方法で設定されていることを確認できるようにすることです。最後に、グループポリシーでユーザーグループを変更するときに、どこに変更を加える必要があるかを識別するために使用されます。これにアプローチする一般的な方法はありますか? PowerShellはこのタスクに耐えますか? PowerShellで結果を読み取り可能な形式に出力することは可能ですか?

4
John

数か月前にすばらしい投稿を読み、基本的にGet-ACLコマンドレットを使用してパスのACLを再帰的にリストするスクリプトをリモートで実行し、Export-CSVコマンドレットを介して出力をパイプして、概要を説明することで、同様の状況に対処しました:

http://jfrmilner.wordpress.com/2011/05/01/audit-ntfs-permissions-powershell-script/

5

リンクと同様 Judaslscariot1651 が提供されます。スクリプトを実行することで、自分が良いことがわかっているもののスナップショットを撮り、必要なときにそれを比較することにさらに取り組みました。ファイルのアクセス許可をXMLに出力して、現在のアクセス許可をXMLに出力し、Compare-Objectを使用してベースラインXMLファイルと比較しました。正確ではないかもしれませんが、私がそれを実行した方法だけです...

注:これはその時点で進行中の作業であり、レジストリキーの値の読み取りからプルした、監視する必要がある特定のパスに向けられています。あなたがおそらく必要とするものの主要な要点は、「情報を収集しています...」の近くから始まります。私は、すべてのコードを提供して、自分がどのように/何をしていたかを示したかっただけです。



#Get date/time for file name
$d = Get-Date -format "yyyyMMdd"
# Pull instance names found on server 
$inst = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances

$warningpreference = "Continue"

foreach($i in $inst) 
{    $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i
    $bin = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup").SQLBinRoot
    $ver = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\MSSQLServer\CurrentVersion").CurrentVersion
    switch -wildcard ($ver) 
    {
        "9*" {$client = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\90').VerSpecificRootDir; break }
        "10*" {$client = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\100').VerSpecificRootDir; break }
    }

    $currentFile = $i + "_" + $d + ".xml"
    "Collecting information on $bin and $client for $i"
        $bin,$client | foreach { Get-ChildItem $_ -Recurse } |
                    Select FullName, CreationTimeUTC, LastWriteTimeUtc, PSIsContainer, Length,
                    @{Name='Owner';Expression={ (Get-Acl $_.PSPath).Owner }},
                    @{Name='ACLRights';Expression={ (Get-Acl $_.PSPath).Access | Select FileSystemRights }},
                    @{Name='ACLUser';Expression={ (Get-Acl $_.PSPath).Access | Select IdentityReference }},
                    @{Name='ACLAccessType';Expression={ (Get-Acl $_.PSPath).Access | Select AccessControlType}} |
                        Export-Clixml $currentFile
    "Current file is: $currentFile"

    $basefile = "baseline_$i.xml"
    if (Test-Path $basefile)
    {
        $base = Import-Clixml $basefile
        $current = Import-Clixml $currentFile
        #now compare
        $results = "Results_" + $i + "_" + $d + ".txt"
        Compare-Object $base $current -Property CreationTimeUTC, LastWriteTimeUtc, Length, FullName, Owner, AclRights, AclUser, AclAccessType |
            Out-File $results

        #determine if the results file shows any changes, if so wave a flag
        if ((Get-Content $results).Length -eq $null)
        {
            "ZERO Changes found"
        }
        else
        {
            "changes found"
        }
    }
    else
    {
        Write-Warning -Message "WARNING: No base file found to compare."
    }
}

1
user47078

この場合、SysinternalsのAccessChkツールとAccessEnumツールが、探しているものにより適していると思います。それらは、File and Disk Utilities here にあります。

1
Christopher