mirror of
https://github.com/PowerShell/openssh-portable.git
synced 2025-07-31 01:35:11 +02:00
fix folder permissions for programdata\ssh during server install (#549)
This commit is contained in:
parent
762704b8b0
commit
9d733203d6
@ -43,6 +43,8 @@ $everyoneSid = Get-UserSID -WellKnownSidType ([System.Security.Principal.WellKno
|
|||||||
|
|
||||||
$currentUserSid = Get-UserSID -User "$($env:USERDOMAIN)\$($env:USERNAME)"
|
$currentUserSid = Get-UserSID -User "$($env:USERDOMAIN)\$($env:USERNAME)"
|
||||||
|
|
||||||
|
$authenticatedUserSid = Get-UserSID -WellKnownSidType ([System.Security.Principal.WellKnownSidType]::AuthenticatedUserSid)
|
||||||
|
|
||||||
#Taken from P/Invoke.NET with minor adjustments.
|
#Taken from P/Invoke.NET with minor adjustments.
|
||||||
$definition = @'
|
$definition = @'
|
||||||
using System;
|
using System;
|
||||||
@ -268,6 +270,33 @@ function Repair-UserSshConfigPermission
|
|||||||
Repair-FilePermission -Owners $UserSid,$adminsSid,$systemSid -AnyAccessOK $UserSid @psBoundParameters
|
Repair-FilePermission -Owners $UserSid,$adminsSid,$systemSid -AnyAccessOK $UserSid @psBoundParameters
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
.Synopsis
|
||||||
|
Repair-SSHFolderPermission
|
||||||
|
Repair the file owner and permission of ssh folder & any files inside it
|
||||||
|
#>
|
||||||
|
function Repair-SSHFolderPermission
|
||||||
|
{
|
||||||
|
[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact="High")]
|
||||||
|
param (
|
||||||
|
[parameter(Mandatory=$true)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string]$sshProgDataPath)
|
||||||
|
|
||||||
|
# SSH Folder - owner: System or Admins; full access: System, Admins; read or readandexecute/synchronize permissible: Authenticated Users
|
||||||
|
Repair-FilePermission -FilePath $sshProgDataPath -Owners $adminsSid, $systemSid -FullAccessNeeded $adminsSid,$systemSid -ReadAndExecuteAccessOK $authenticatedUserSid
|
||||||
|
# Files in SSH Folder (excluding private key files)
|
||||||
|
# owner: System or Admins; full access: System, Admins; read/readandexecute/synchronize permissable: Authenticated Users
|
||||||
|
$privateKeyFiles = @("ssh_host_dsa_key", "ssh_host_ecdsa_key", "ssh_host_ed25519_key", "ssh_host_rsa_key")
|
||||||
|
Get-ChildItem -Path (Join-Path $sshProgDataPath '*') -Recurse -Exclude ($privateKeyFiles) -Force | ForEach-Object {
|
||||||
|
Repair-FilePermission -FilePath $_.FullName -Owners $adminsSid, $systemSid -FullAccessNeeded $adminsSid, $systemSid -ReadAndExecuteAccessOK $authenticatedUserSid
|
||||||
|
}
|
||||||
|
# Private key files - owner: System or Admins; full access: System, Admins
|
||||||
|
Get-ChildItem -Path (Join-Path $sshProgDataPath '*') -Recurse -Include $privateKeyFiles -Force | ForEach-Object {
|
||||||
|
Repair-FilePermission -FilePath $_.FullName -Owners $adminsSid, $systemSid -FullAccessNeeded $systemSid, $adminsSid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
<#
|
<#
|
||||||
.Synopsis
|
.Synopsis
|
||||||
Repair-FilePermissionInternal
|
Repair-FilePermissionInternal
|
||||||
@ -285,10 +314,11 @@ function Repair-FilePermission
|
|||||||
[System.Security.Principal.SecurityIdentifier[]] $AnyAccessOK = $null,
|
[System.Security.Principal.SecurityIdentifier[]] $AnyAccessOK = $null,
|
||||||
[System.Security.Principal.SecurityIdentifier[]] $FullAccessNeeded = $null,
|
[System.Security.Principal.SecurityIdentifier[]] $FullAccessNeeded = $null,
|
||||||
[System.Security.Principal.SecurityIdentifier[]] $ReadAccessOK = $null,
|
[System.Security.Principal.SecurityIdentifier[]] $ReadAccessOK = $null,
|
||||||
[System.Security.Principal.SecurityIdentifier[]] $ReadAccessNeeded = $null
|
[System.Security.Principal.SecurityIdentifier[]] $ReadAccessNeeded = $null,
|
||||||
|
[System.Security.Principal.SecurityIdentifier[]] $ReadAndExecuteAccessOK = $null
|
||||||
)
|
)
|
||||||
|
|
||||||
if(-not (Test-Path $FilePath -PathType Leaf))
|
if(-not (Test-Path $FilePath))
|
||||||
{
|
{
|
||||||
Write-host "$FilePath not found" -ForegroundColor Yellow
|
Write-host "$FilePath not found" -ForegroundColor Yellow
|
||||||
return
|
return
|
||||||
@ -319,7 +349,8 @@ function Repair-FilePermissionInternal {
|
|||||||
[System.Security.Principal.SecurityIdentifier[]] $AnyAccessOK = $null,
|
[System.Security.Principal.SecurityIdentifier[]] $AnyAccessOK = $null,
|
||||||
[System.Security.Principal.SecurityIdentifier[]] $FullAccessNeeded = $null,
|
[System.Security.Principal.SecurityIdentifier[]] $FullAccessNeeded = $null,
|
||||||
[System.Security.Principal.SecurityIdentifier[]] $ReadAccessOK = $null,
|
[System.Security.Principal.SecurityIdentifier[]] $ReadAccessOK = $null,
|
||||||
[System.Security.Principal.SecurityIdentifier[]] $ReadAccessNeeded = $null
|
[System.Security.Principal.SecurityIdentifier[]] $ReadAccessNeeded = $null,
|
||||||
|
[System.Security.Principal.SecurityIdentifier[]] $ReadAndExecuteAccessOK = $null
|
||||||
)
|
)
|
||||||
|
|
||||||
$acl = Get-Acl $FilePath
|
$acl = Get-Acl $FilePath
|
||||||
@ -353,6 +384,7 @@ function Repair-FilePermissionInternal {
|
|||||||
|
|
||||||
$ReadAccessPerm = ([System.UInt32] [System.Security.AccessControl.FileSystemRights]::Read.value__) -bor `
|
$ReadAccessPerm = ([System.UInt32] [System.Security.AccessControl.FileSystemRights]::Read.value__) -bor `
|
||||||
([System.UInt32] [System.Security.AccessControl.FileSystemRights]::Synchronize.value__)
|
([System.UInt32] [System.Security.AccessControl.FileSystemRights]::Synchronize.value__)
|
||||||
|
$ReadAndExecuteAccessPerm = $ReadAccessPerm -bor ([System.UInt32] [System.Security.AccessControl.FileSystemRights]::ReadAndExecute.value__)
|
||||||
$FullControlPerm = [System.UInt32] [System.Security.AccessControl.FileSystemRights]::FullControl.value__
|
$FullControlPerm = [System.UInt32] [System.Security.AccessControl.FileSystemRights]::FullControl.value__
|
||||||
|
|
||||||
#system and admin groups can have any access to the file; plus the account in the AnyAccessOK list
|
#system and admin groups can have any access to the file; plus the account in the AnyAccessOK list
|
||||||
@ -455,6 +487,48 @@ function Repair-FilePermissionInternal {
|
|||||||
#ignore those accounts listed in the AnyAccessOK list.
|
#ignore those accounts listed in the AnyAccessOK list.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
# Handle ReadAndExecuteAccessOK list and make sure they are only granted Read or ReadAndExecute & Synchronize access
|
||||||
|
elseif($ReadAndExecuteAccessOK -contains $IdentityReferenceSid)
|
||||||
|
{
|
||||||
|
# checks if user access is already either: Read or ReadAndExecute & Synchronize
|
||||||
|
if (-not ($a.AccessControlType.Equals([System.Security.AccessControl.AccessControlType]::Allow)) -or `
|
||||||
|
(-not (([System.UInt32]$a.FileSystemRights.value__) -band (-bnot $ReadAndExecuteAccessPerm))))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($a.IsInherited)
|
||||||
|
{
|
||||||
|
if($needChange)
|
||||||
|
{
|
||||||
|
Enable-Privilege SeRestorePrivilege | out-null
|
||||||
|
Set-Acl -Path $FilePath -AclObject $acl -Confirm:$false
|
||||||
|
}
|
||||||
|
|
||||||
|
return Remove-RuleProtection @paras
|
||||||
|
}
|
||||||
|
$caption = "'$($a.IdentityReference)' has the following access to '$FilePath': '$($a.FileSystemRights)'."
|
||||||
|
$prompt = "Shall I make it ReadAndExecute, and Synchronize only?"
|
||||||
|
$description = "Set'$($a.IdentityReference)' Read access only to '$FilePath'. "
|
||||||
|
|
||||||
|
if($pscmdlet.ShouldProcess($description, $prompt, $caption))
|
||||||
|
{
|
||||||
|
$needChange = $true
|
||||||
|
$ace = New-Object System.Security.AccessControl.FileSystemAccessRule `
|
||||||
|
($IdentityReferenceSid, "ReadAndExecute, Synchronize", "None", "None", "Allow")
|
||||||
|
|
||||||
|
$acl.SetAccessRule($ace)
|
||||||
|
Write-Host "'$($a.IdentityReference)' now has ReadAndExecute, Synchronize access to '$FilePath'. " -ForegroundColor Green
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$health = $false
|
||||||
|
if(-not $PSBoundParameters.ContainsKey("WhatIf"))
|
||||||
|
{
|
||||||
|
Write-Host "'$($a.IdentityReference)' still has these access to '$FilePath': '$($a.FileSystemRights)'." -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
#If everyone is in the ReadAccessOK list, any user can have read access;
|
#If everyone is in the ReadAccessOK list, any user can have read access;
|
||||||
# below block make sure they are granted Read access only
|
# below block make sure they are granted Read access only
|
||||||
elseif(($realReadAcessOKList -contains $everyoneSid) -or ($realReadAcessOKList -contains $IdentityReferenceSid))
|
elseif(($realReadAcessOKList -contains $everyoneSid) -or ($realReadAcessOKList -contains $IdentityReferenceSid))
|
||||||
@ -649,7 +723,7 @@ function Remove-RuleProtection
|
|||||||
[string]$FilePath
|
[string]$FilePath
|
||||||
)
|
)
|
||||||
$message = "Need to remove the inheritance before repair the rules."
|
$message = "Need to remove the inheritance before repair the rules."
|
||||||
$prompt = "Shall I remove the inheritace?"
|
$prompt = "Shall I remove the inheritance?"
|
||||||
$description = "Remove inheritance of '$FilePath'."
|
$description = "Remove inheritance of '$FilePath'."
|
||||||
|
|
||||||
if($pscmdlet.ShouldProcess($description, $prompt, $message))
|
if($pscmdlet.ShouldProcess($description, $prompt, $message))
|
||||||
@ -734,4 +808,4 @@ function Enable-Privilege {
|
|||||||
$type[0]::EnablePrivilege($Privilege, $Disable)
|
$type[0]::EnablePrivilege($Privilege, $Disable)
|
||||||
}
|
}
|
||||||
|
|
||||||
Export-ModuleMember -Function Repair-FilePermission, Repair-SshdConfigPermission, Repair-SshdHostKeyPermission, Repair-AuthorizedKeyPermission, Repair-UserKeyPermission, Repair-UserSshConfigPermission, Enable-Privilege, Get-UserAccount, Get-UserSID, Repair-AdministratorsAuthorizedKeysPermission, Repair-ModuliFilePermission
|
Export-ModuleMember -Function Repair-FilePermission, Repair-SshdConfigPermission, Repair-SshdHostKeyPermission, Repair-AuthorizedKeyPermission, Repair-UserKeyPermission, Repair-UserSshConfigPermission, Enable-Privilege, Get-UserAccount, Get-UserSID, Repair-AdministratorsAuthorizedKeysPermission, Repair-ModuliFilePermission, Repair-SSHFolderPermission
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
# @friism - Fixed issue with invalid SDDL on Set-Acl
|
# @friism - Fixed issue with invalid SDDL on Set-Acl
|
||||||
# @manojampalam - removed ntrights.exe dependency
|
# @manojampalam - removed ntrights.exe dependency
|
||||||
# @bingbing8 - removed secedit.exe dependency
|
# @bingbing8 - removed secedit.exe dependency
|
||||||
|
# @tessgauthier - added permissions check for %programData%/ssh
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
@ -84,6 +85,13 @@ if (Test-Path $moduliPath -PathType Leaf)
|
|||||||
Repair-ModuliFilePermission -FilePath $moduliPath @psBoundParameters -confirm:$false
|
Repair-ModuliFilePermission -FilePath $moduliPath @psBoundParameters -confirm:$false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# If %programData%/ssh folder already exists, verify and, if necessary and approved by user, fix permissions
|
||||||
|
$sshProgDataPath = Join-Path $env:ProgramData "ssh"
|
||||||
|
if (Test-Path $sshProgDataPath)
|
||||||
|
{
|
||||||
|
Repair-SSHFolderPermission -sshProgDataPath $sshProgDataPath
|
||||||
|
}
|
||||||
|
|
||||||
#register etw provider
|
#register etw provider
|
||||||
wevtutil im `"$etwman`"
|
wevtutil im `"$etwman`"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user