суббота, 6 июня 2009 г.

SID для службы

В Windows Vista и более новых версиях ОС от Microsoft, есть довольно интересная и полезная фича – назначение SID (Security Identifier), каждому сервису отдельно. Добиться этого можно так:

sc sidtype
ОПИСАНИЕ.
        Изменение параметра типа идентификатора безопасности (SID) службы.

        Если данный параметр имеет значение unrestricted, диспетчер управления
        службами (SCM) добавит SID этой службы к маркеру процесса службы в
        следующий раз, когда этот процесс будет запущен при запуске первой из
        своих служб.  Данный параметр можно использовать только для служб
        пользовательского режима Win32.

        Если данный параметр имеет значение restricted, диспетчер управления
        службами (SCM) добавит SID этой службы к маркеру процесса службы в
        следующий раз, когда этот процесс будет запущен при запуске первой из
        своих служб. Кроме того, SID данной службы будет добавлен к списку
        ограничивающих SID в маркере процесса. Маркер процесса будет являться
        ограниченным маркером.  Дополнительные сведения об ограниченном маркере
        см. в MSDN. Данный параметр можно использовать только для служб
        пользовательского режима Win32. Кроме того, если служба является
        участником разделяемого процесса, все службы, участвующие в этом
        процессе, должны иметь данный тип SID,  чтобы описанные выше действия
        были выполнены.

        Если данный параметр имеет значение none, SCM не будет добавлять SID
        службы к маркеру процесса службы.
ИСПОЛЬЗОВАНИЕ:
        sc <сервер> sidtype [имя службы] [тип]

ПАРАМЕТРЫ:
        тип = <none|unrestricted|restricted>

То есть, вы можете указать системе, чтобы она сгенерировала специальный SID для вашей службы. К вашему сервису будет привязан SID, что даст возможность давать права на ресурсы конкретно вашей службе, и никому другому. Для этого необходимо, чтобы служба имела тип SID – unrestricted

Еще один интересный параметр – restricted. В том случае, когда он применяется, в маркер процесса, исполняющего службу, добавляется список ограничивающих SID. Например, если некий процесс выполняется с правами некоего пользователя и имеет доступ к некой папке, то если вы добавите к его маркеру ограничивающие SID, такие, что они не имеют таких прав – то и процесс, при попытке доступа в нее получит отказ. Это происходит потому, что при проверке доступа происходит две независимые проверки. Одна, для стандартного списка SID, вторая – для ограничивающего. Доступ предоставляется только в том случае, если обе проверки проходят без ошибок. По большому счету такой подход защищает систему от вашей службы, в случае, если она будет “взломана”, ведь обладая таким маркером она потеряет доступ на запись во многие места системы.

На самом деле я не большой специалист в написании скриптов :), однако вот таким вот макаром можно узнать, какие службы с каким типом SID запущен в  Vista:

cls

function sidType ($name)
{
    $si = new-object System.Diagnostics.ProcessStartInfo
    $si.FileName = "sc.exe"
    $si.CreateNoWindow = $true
    $si.RedirectStandardOutput = $true
    $si.UseShellExecute = $false
     $si.Arguments = "qsidtype " + $name

    $proc = [diagnostics.process]::Start($si)
    $proc.WaitForExit()
    [string] $str = $proc.StandardOutput.ReadToEnd().Trim().Split("`n") | Select-String -Pattern "SERVICE_SID_TYPE: "
    $str.Replace("SERVICE_SID_TYPE: ","").Trim()
};

$wmiServices = @{}
Get-WmiObject -Namespace root\cimv2 -Class Win32_Service| ForEach-Object {
    $sidType = sidType $_.Name
    $wmiServices.Add($_.Name,$sidType)
    }

$wmiServices.Keys | where-object {$wmiServices[$_] -eq "UNRESTRICTED"} | Format-Table

В результате, с типом RESTRICTED в моей системе запущены всего несколько служб:

NetTcpPortSharing
DPS
BFE
pla
MpsSvc

Комментариев нет: