mirror of
https://dev.azure.com/effectory/Survey%20Software/_git/Cloud%20Engineering
synced 2026-02-27 18:52:18 +01:00
Subdomain takeover module
- Added webapps, frontdoor, storage and cdn
This commit is contained in:
@@ -7,8 +7,8 @@ Find dangling DNS records
|
|||||||
Compares DNS bindings with a previous state and checks the existence of DNS records for bindings that may have been deleted.
|
Compares DNS bindings with a previous state and checks the existence of DNS records for bindings that may have been deleted.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
'public', 'private' |
|
'public', 'private', 'classes' |
|
||||||
Resolve-Path -Path $PSScriptRoot -ChildPath { $_ } |
|
Join-Path -Path $PSScriptRoot -ChildPath { $_ } |
|
||||||
Get-ChildItem -Recurse -File -Filter *.ps1 |
|
Get-ChildItem -Recurse -File -Filter *.ps1 |
|
||||||
ForEach-Object {
|
ForEach-Object {
|
||||||
. $_.FullName
|
. $_.FullName
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
class Effectory-DomainNameCheck {
|
class EffectoryDomainNameCheck {
|
||||||
[string] $SubscriptionId = ""
|
[string] $SubscriptionId = ""
|
||||||
[string] $SubscriptionName = ""
|
[string] $SubscriptionName = ""
|
||||||
[string] $ResourceId = ""
|
[string] $ResourceId = ""
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
function CheckCdnEndpoints() {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$subscription,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Cdn.Models.Profile.PSProfile[]] $cdnProfiles,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string]$effectoryDomainPattern
|
||||||
|
)
|
||||||
|
[EffectoryDomainNameCheck[]]$Result = @()
|
||||||
|
|
||||||
|
foreach($cdnProfile in $cdnProfiles) {
|
||||||
|
$cdnEndPoints = Get-AzCdnEndpoint -ProfileName $cdnProfile.Name -ResourceGroupName $cdnProfile.ResourceGroupName
|
||||||
|
foreach($cdnEndPoint in $cdnEndPoints) {
|
||||||
|
$resource = Get-AzResource -ResourceId $cdnEndPoint.Id
|
||||||
|
$cdnEffectory = Get-AzCdnCustomDomain -CdnEndpoint $cdnEndPoint | Where-Object HostName -Like $effectoryDomainPattern
|
||||||
|
|
||||||
|
foreach($cdn in $cdnEffectory) {
|
||||||
|
$domainNameCheck = [EffectoryDomainNameCheck] @{
|
||||||
|
SubscriptionId = $subscriptionId;
|
||||||
|
SubscriptionName = $subscription.Name;
|
||||||
|
ResourceId = $cdn.Id;
|
||||||
|
ResourceName = $cdn.Name;
|
||||||
|
ResourceType = $cdn.Type;
|
||||||
|
ResourceGroupName = $cdn.ResourceGroupName;
|
||||||
|
DomainName = $cdn.HostName;
|
||||||
|
Tag_Team = $resource.Tags.team
|
||||||
|
Tag_Product = $resource.Tags.product
|
||||||
|
Tag_Environment = $resource.Tags.environment
|
||||||
|
Tag_Data = $resource.Tags.data
|
||||||
|
}
|
||||||
|
$Result += $domainNameCheck
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$Result
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
function CheckFrontDoorEndPoints() {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$subscription,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.FrontDoor.Models.PSFrontDoor[]] $frontDoors,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string]$effectoryDomainPattern
|
||||||
|
)
|
||||||
|
[EffectoryDomainNameCheck[]]$Result = @()
|
||||||
|
|
||||||
|
foreach($frontDoor in $frontDoors) {
|
||||||
|
$resource = Get-AzResource -ResourceId $frontDoor.Id
|
||||||
|
|
||||||
|
if ($endPointHostNames = $frontDoor.FrontendEndpoints | Where-Object HostName -like $effectoryDomainPattern) {
|
||||||
|
foreach ($endPoint in $endPointHostNames) {
|
||||||
|
# frontdoor
|
||||||
|
$domainNameCheck = [EffectoryDomainNameCheck] @{
|
||||||
|
SubscriptionId = $subscriptionId;
|
||||||
|
SubscriptionName = $subscription.Name;
|
||||||
|
ResourceId = $endPoint.Id;
|
||||||
|
ResourceName = $endPoint.Name;
|
||||||
|
ResourceType = $endPoint.Type;
|
||||||
|
ResourceGroupName = $resource.ResourceGroupName;
|
||||||
|
DomainName = $endPoint.HostName;
|
||||||
|
Tag_Team = $resource.Tags.team
|
||||||
|
Tag_Product = $resource.Tags.product
|
||||||
|
Tag_Environment = $resource.Tags.environment
|
||||||
|
Tag_Data = $resource.Tags.data
|
||||||
|
}
|
||||||
|
$Result += $domainNameCheck
|
||||||
|
} }
|
||||||
|
}
|
||||||
|
|
||||||
|
$Result
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
function CheckStorageAccounts() {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$subscription,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Management.Storage.Models.PSStorageAccount[]] $storageAccounts,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string]$effectoryDomainPattern
|
||||||
|
)
|
||||||
|
[EffectoryDomainNameCheck[]]$Result = @()
|
||||||
|
|
||||||
|
foreach($storageAccount in $storageAccounts) {
|
||||||
|
$resource = Get-AzResource -ResourceId $storageAccount.Id
|
||||||
|
|
||||||
|
$domainNameCheck = [EffectoryDomainNameCheck] @{
|
||||||
|
SubscriptionId = $subscriptionId;
|
||||||
|
SubscriptionName = $subscription.Name;
|
||||||
|
ResourceId = $storageAccount.Id;
|
||||||
|
ResourceName = $resource.Name;
|
||||||
|
ResourceType = $resource.ResourceType;
|
||||||
|
ResourceGroupName = $resource.ResourceGroupName;
|
||||||
|
DomainName = $storageAccount.CustomDomain.Name;
|
||||||
|
Tag_Team = $resource.Tags.team
|
||||||
|
Tag_Product = $resource.Tags.product
|
||||||
|
Tag_Environment = $resource.Tags.environment
|
||||||
|
Tag_Data = $resource.Tags.data
|
||||||
|
}
|
||||||
|
$Result += $domainNameCheck
|
||||||
|
}
|
||||||
|
|
||||||
|
$Result
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
function CheckWebApps() {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$subscription,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.WebApps.Models.PSSite[]] $webApps,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string]$effectoryDomainPattern
|
||||||
|
)
|
||||||
|
[EffectoryDomainNameCheck[]]$Result = @()
|
||||||
|
|
||||||
|
$webAppsEffectory = $webApps | Where-Object {@($_.HostNames) -like $effectoryDomainPattern}
|
||||||
|
foreach ($webAppEffectory in $webAppsEffectory) {
|
||||||
|
foreach ($hostName in $webAppEffectory.HostNames | Where-Object {$_ -like $effectoryDomainPattern}) {
|
||||||
|
$domainNameCheck = [EffectoryDomainNameCheck] @{
|
||||||
|
SubscriptionId = $subscriptionId;
|
||||||
|
SubscriptionName = $subscription.Name;
|
||||||
|
ResourceId = $webAppEffectory.Id;
|
||||||
|
ResourceName = $webAppEffectory.Name;
|
||||||
|
ResourceType = $webAppEffectory.Type;
|
||||||
|
ResourceGroupName = $webAppEffectory.ResourceGroup;
|
||||||
|
DomainName = $hostName;
|
||||||
|
Tag_Team = $webAppEffectory.Tags.team
|
||||||
|
Tag_Product = $webAppEffectory.Tags.product
|
||||||
|
Tag_Environment = $webAppEffectory.Tags.environment
|
||||||
|
Tag_Data = $webAppEffectory.Tags.data
|
||||||
|
}
|
||||||
|
$Result += $domainNameCheck
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$Result
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
function GetDomainNameCheck () {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$subscription,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Management.WebSites.Models.Resource] $resource
|
||||||
|
)
|
||||||
|
$Result = [EffectoryDomainNameCheck] @{
|
||||||
|
SubscriptionId = $subscriptionId;
|
||||||
|
SubscriptionName = $subscription.Name;
|
||||||
|
ResourceId = $resource.Id;
|
||||||
|
ResourceName = $resource.Name;
|
||||||
|
ResourceType = $resource.Type;
|
||||||
|
Tag_Team = $resource.Tags.team
|
||||||
|
Tag_Product = $resource.Tags.product
|
||||||
|
Tag_Environment = $resource.Tags.environment
|
||||||
|
Tag_Data = $resource.Tags.data
|
||||||
|
}
|
||||||
|
|
||||||
|
$Result;
|
||||||
|
}
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
#Requires -Modules Az.Accounts,Az.Websites,Az.FrontDoor,Az.Storage,Az.Cdn,Az.Network,Az.TrafficManager,Az.ContainerInstance
|
||||||
|
function Get-EffectoryDomainResources {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Find dangling DNS records
|
||||||
|
.DESCRIPTION
|
||||||
|
Compares DNS bindings with a previous state and checks the existence of DNS records for bindings that may have been deleted.
|
||||||
|
.PARAMETER subscriptionId
|
||||||
|
Optional Subscription Id to set the context to. Otherwise uses the current context.
|
||||||
|
#>
|
||||||
|
param(
|
||||||
|
[Parameter()]
|
||||||
|
[string] $subscriptionId
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize
|
||||||
|
[EffectoryDomainNameCheck[]]$result = @()
|
||||||
|
[string]$effectoryDomainPattern = "*.effectory.com"
|
||||||
|
|
||||||
|
# Get subscription info
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$currentContext = $null
|
||||||
|
if (![string]::IsNullOrWhitespace($subscriptionId)) {
|
||||||
|
$currentContext = Set-AzContext -SubscriptionId $subscriptionId
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$currentContext = Get-AzContext
|
||||||
|
$subscriptionId = $currentContext.Subscription
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Processing subscription $($currentContext.Name)"
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------------------------------------------
|
||||||
|
Write-Host "Checking WebApps and WebApp Slots for subscription $($currentContext.Name)"
|
||||||
|
# $webApps = Get-AzWebApp
|
||||||
|
# [int]$webAppCounter = 0
|
||||||
|
# [int]$webAppSlotCounter = 0
|
||||||
|
|
||||||
|
# if ($null -ne $webApps) {
|
||||||
|
# # check webapps
|
||||||
|
# $itemsWebApps = CheckWebApps -subscription $currentContext -webApps $webApps -effectoryDomainPattern $effectoryDomainPattern
|
||||||
|
# $webAppCounter += $itemsWebApps.Count
|
||||||
|
# $result += $itemsWebApps
|
||||||
|
|
||||||
|
# # check webapp slots
|
||||||
|
# foreach ($webApp in $webApps) {
|
||||||
|
# $slot = Get-AzWebAppSlot -WebApp $webApp
|
||||||
|
# if ($null -ne $slot) {
|
||||||
|
# $itemsWebAppSlots = CheckWebApps -subscription $currentContext -webApps $slot -effectoryDomainPattern $effectoryDomainPattern
|
||||||
|
# $webAppSlotCounter += $itemsWebAppSlots.Count
|
||||||
|
# $result += $itemsWebAppSlots
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# Write-Host "Found $($webAppCounter) WebApps and $($webAppSlotsCounter) WebApp Slots for subscription $($currentContext.Name)"
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------------------------------------------
|
||||||
|
Write-Host "Checking FrontDoor Endpoints for subscription $($currentContext.Name)"
|
||||||
|
$frontDoors = Get-AzFrontDoor
|
||||||
|
[int]$frontDoorEndPointCounter = 0
|
||||||
|
|
||||||
|
if ($null -ne $frontDoors) {
|
||||||
|
$itemsFrontDoors = CheckFrontDoorEndPoints -subscription $currentContext -frontDoors $frontDoors -effectoryDomainPattern $effectoryDomainPattern
|
||||||
|
$frontDoorEndPointCounter += $itemsFrontDoors.Count
|
||||||
|
$result += $itemsFrontDoors
|
||||||
|
}
|
||||||
|
Write-Host "Found $($frontDoorEndPointCounter) FrontDoor Endpoints for subscription $($currentContext.Name)"
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------------------------------------------
|
||||||
|
Write-Host "Checking Storage Accounts for subscription $($currentContext.Name)"
|
||||||
|
$storageAccounts = Get-AzStorageAccount | Where-Object { $_.CustomDomain.Name -like $effectoryDomainPattern } # storage accounts
|
||||||
|
[int]$storageCounter = 0
|
||||||
|
|
||||||
|
if ($null -ne $storageAccounts) {
|
||||||
|
$itemsStorage = CheckStorageAccounts -subscription $currentContext -storageAccounts $storageAccounts -effectoryDomainPattern $effectoryDomainPattern
|
||||||
|
$storageCounter += $itemsStorage.Count
|
||||||
|
$result += $itemsStorage
|
||||||
|
}
|
||||||
|
Write-Host "Found $($storageCounter) Storage Accounts for subscription $($currentContext.Name)"
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------------------------------------------
|
||||||
|
Write-Host "Checking Cdn Endpoints for subscription $($currentContext.Name)"
|
||||||
|
$cdnProfiles = Get-AzCdnProfile
|
||||||
|
[int]$cdnCounter = 0
|
||||||
|
|
||||||
|
if ($null -ne $cdnProfiles) {
|
||||||
|
$itemsCdn = CheckCdnEndpoints -subscription $currentContext -cdnProfiles $cdnProfiles -effectoryDomainPattern $effectoryDomainPattern
|
||||||
|
$cdnCounter += $itemsCdn.Count
|
||||||
|
$result += $itemsCdn
|
||||||
|
}
|
||||||
|
Write-Host "Found $($cdnCounter) Cdn Endpoints for subscription $($currentContext.Name)"
|
||||||
|
|
||||||
|
|
||||||
|
$result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
#
|
||||||
|
# Module manifest for module 'Effectory.Dns'
|
||||||
|
#
|
||||||
|
# Generated by: Jurjen Ladenius
|
||||||
|
#
|
||||||
|
# Generated on: 8/11/2021
|
||||||
|
#
|
||||||
|
|
||||||
|
@{
|
||||||
|
|
||||||
|
# Script module or binary module file associated with this manifest.
|
||||||
|
RootModule = 'Effectory.Dns.psm1'
|
||||||
|
|
||||||
|
# Version number of this module.
|
||||||
|
ModuleVersion = '0.0.1'
|
||||||
|
|
||||||
|
# Supported PSEditions
|
||||||
|
# CompatiblePSEditions = @()
|
||||||
|
|
||||||
|
# ID used to uniquely identify this module
|
||||||
|
GUID = '1e64644e-639c-47d1-8816-c0e48390a6a7'
|
||||||
|
|
||||||
|
# Author of this module
|
||||||
|
Author = 'Jurjen Ladenius'
|
||||||
|
|
||||||
|
# Company or vendor of this module
|
||||||
|
CompanyName = 'Effectory B.V.'
|
||||||
|
|
||||||
|
# Copyright statement for this module
|
||||||
|
Copyright = '(c) Effectory B.V. - Jurjen Ladenius. All rights reserved.'
|
||||||
|
|
||||||
|
# Description of the functionality provided by this module
|
||||||
|
# Description = ''
|
||||||
|
|
||||||
|
# Minimum version of the PowerShell engine required by this module
|
||||||
|
# PowerShellVersion = ''
|
||||||
|
|
||||||
|
# Name of the PowerShell host required by this module
|
||||||
|
# PowerShellHostName = ''
|
||||||
|
|
||||||
|
# Minimum version of the PowerShell host required by this module
|
||||||
|
# PowerShellHostVersion = ''
|
||||||
|
|
||||||
|
# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
|
||||||
|
# DotNetFrameworkVersion = ''
|
||||||
|
|
||||||
|
# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
|
||||||
|
# ClrVersion = ''
|
||||||
|
|
||||||
|
# Processor architecture (None, X86, Amd64) required by this module
|
||||||
|
# ProcessorArchitecture = ''
|
||||||
|
|
||||||
|
# Modules that must be imported into the global environment prior to importing this module
|
||||||
|
# RequiredModules = @()
|
||||||
|
|
||||||
|
# Assemblies that must be loaded prior to importing this module
|
||||||
|
# RequiredAssemblies = @()
|
||||||
|
|
||||||
|
# Script files (.ps1) that are run in the caller's environment prior to importing this module.
|
||||||
|
# ScriptsToProcess = @()
|
||||||
|
|
||||||
|
# Type files (.ps1xml) to be loaded when importing this module
|
||||||
|
# TypesToProcess = @()
|
||||||
|
|
||||||
|
# Format files (.ps1xml) to be loaded when importing this module
|
||||||
|
# FormatsToProcess = @()
|
||||||
|
|
||||||
|
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
|
||||||
|
# NestedModules = @()
|
||||||
|
|
||||||
|
# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
|
||||||
|
FunctionsToExport = 'Get-EffectoryDomainResources'
|
||||||
|
|
||||||
|
# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
|
||||||
|
CmdletsToExport = '*'
|
||||||
|
|
||||||
|
# Variables to export from this module
|
||||||
|
VariablesToExport = '*'
|
||||||
|
|
||||||
|
# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
|
||||||
|
AliasesToExport = '*'
|
||||||
|
|
||||||
|
# DSC resources to export from this module
|
||||||
|
# DscResourcesToExport = @()
|
||||||
|
|
||||||
|
# List of all modules packaged with this module
|
||||||
|
# ModuleList = @()
|
||||||
|
|
||||||
|
# List of all files packaged with this module
|
||||||
|
# FileList = @()
|
||||||
|
|
||||||
|
# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
|
||||||
|
PrivateData = @{
|
||||||
|
|
||||||
|
PSData = @{
|
||||||
|
|
||||||
|
# Tags applied to this module. These help with module discovery in online galleries.
|
||||||
|
# Tags = @()
|
||||||
|
|
||||||
|
# A URL to the license for this module.
|
||||||
|
# LicenseUri = ''
|
||||||
|
|
||||||
|
# A URL to the main website for this project.
|
||||||
|
# ProjectUri = ''
|
||||||
|
|
||||||
|
# A URL to an icon representing this module.
|
||||||
|
# IconUri = ''
|
||||||
|
|
||||||
|
# ReleaseNotes of this module
|
||||||
|
# ReleaseNotes = ''
|
||||||
|
|
||||||
|
# Prerelease string of this module
|
||||||
|
# Prerelease = ''
|
||||||
|
|
||||||
|
# Flag to indicate whether the module requires explicit user acceptance for install/update/save
|
||||||
|
# RequireLicenseAcceptance = $false
|
||||||
|
|
||||||
|
# External dependent modules of this module
|
||||||
|
# ExternalModuleDependencies = @()
|
||||||
|
|
||||||
|
} # End of PSData hashtable
|
||||||
|
|
||||||
|
} # End of PrivateData hashtable
|
||||||
|
|
||||||
|
# HelpInfo URI of this module
|
||||||
|
# HelpInfoURI = ''
|
||||||
|
|
||||||
|
# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
|
||||||
|
# DefaultCommandPrefix = ''
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
#Region '.\classes\Effectory-DomainNameCheck.ps1' 0
|
||||||
|
class EffectoryDomainNameCheck {
|
||||||
|
[string] $SubscriptionId = ""
|
||||||
|
[string] $SubscriptionName = ""
|
||||||
|
[string] $ResourceId = ""
|
||||||
|
[string] $ResourceGroupName = ""
|
||||||
|
[string] $ResourceName = ""
|
||||||
|
[string] $ResourceType = ""
|
||||||
|
[string] $DomainName = ""
|
||||||
|
[string] $Tag_Team = ""
|
||||||
|
[string] $Tag_Product = ""
|
||||||
|
[string] $Tag_Environment = ""
|
||||||
|
[string] $Tag_Data = ""
|
||||||
|
}
|
||||||
|
#EndRegion '.\classes\Effectory-DomainNameCheck.ps1' 14
|
||||||
|
#Region '.\private\CheckWebApps.ps1' 0
|
||||||
|
function CheckWebApps() {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$subscription,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.WebApps.Models.PSSite[]] $webApps,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string]$effectoryDomainPattern
|
||||||
|
)
|
||||||
|
[EffectoryDomainNameCheck[]]$Result = @()
|
||||||
|
|
||||||
|
$webAppsEffectory = $webApps | Where-Object {@($_.HostNames) -like $effectoryDomainPattern}
|
||||||
|
foreach ($webAppEffectory in $webAppsEffectory) {
|
||||||
|
foreach ($hostName in $webAppEffectory.HostNames) {
|
||||||
|
$domainNameCheck = GetDomainNameCheck($subscription, $webAppEffectory)
|
||||||
|
$domainNameCheck.ResourceGroupName = $webAppEffectory.ResourceGroup
|
||||||
|
$domainNameCheck.DomainName = $hostName
|
||||||
|
$Result += $domainNameCheck
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$Result
|
||||||
|
}
|
||||||
|
#EndRegion '.\private\CheckWebApps.ps1' 24
|
||||||
|
#Region '.\private\GetDomainNameCheck.ps1' 0
|
||||||
|
function GetDomainNameCheck () {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$subscription,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[Microsoft.Azure.Commands.WebApps.Models.Resource] $resource
|
||||||
|
)
|
||||||
|
$Result = [EffectoryDomainNameCheck] @{
|
||||||
|
SubscriptionId = $subscriptionId;
|
||||||
|
SubscriptionName = $subscription.Name;
|
||||||
|
ResourceId = $resource.Id;
|
||||||
|
ResourceName = $resource.Name;
|
||||||
|
ResourceType = $resource.Type;
|
||||||
|
Tag_Team = $resource.Tags.team
|
||||||
|
Tag_Product = $resource.Tags.product
|
||||||
|
Tag_Environment = $resource.Tags.environment
|
||||||
|
Tag_Data = $resource.Tags.data
|
||||||
|
}
|
||||||
|
|
||||||
|
$Result;
|
||||||
|
}
|
||||||
|
#EndRegion '.\private\GetDomainNameCheck.ps1' 22
|
||||||
|
#Region '.\public\Get-EffectoryDomainResources.ps1' 0
|
||||||
|
function Get-EffectoryDomainResources {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Find dangling DNS records
|
||||||
|
.DESCRIPTION
|
||||||
|
Compares DNS bindings with a previous state and checks the existence of DNS records for bindings that may have been deleted.
|
||||||
|
.PARAMETER subscriptionId
|
||||||
|
Optional Subscription Id to set the context to. Otherwise uses the current context.
|
||||||
|
#>
|
||||||
|
param(
|
||||||
|
[Parameter()]
|
||||||
|
[string] $subscriptionId
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize
|
||||||
|
[EffectoryDomainNameCheck[]]$result = @()
|
||||||
|
[string]$effectoryDomainPattern = "*.effectory.com"
|
||||||
|
|
||||||
|
# Get subscription info
|
||||||
|
[Microsoft.Azure.Commands.Profile.Models.Core.PSAzureContext]$currentContext = $null
|
||||||
|
if (![string]::IsNullOrWhitespace($subscriptionId)) {
|
||||||
|
$currentContext = Set-AzContext -SubscriptionId $subscriptionId
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$currentContext = Get-AzContext
|
||||||
|
$subscriptionId = $currentContext.Subscription
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Verbose "Processing subscription $($currentContext.Name) [$($subscriptionId)]"
|
||||||
|
|
||||||
|
$webApps = Get-AzWebApp
|
||||||
|
|
||||||
|
$items = CheckWebApps -subscription $currentContext -webApps $webApps -effectoryDomainPattern $effectoryDomainPattern
|
||||||
|
$result = $result + $items
|
||||||
|
|
||||||
|
$result
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# $webAppsEffectory = $webApps | Where-Object {@($_.HostNames) -like "*.effectory.com"} # app service
|
||||||
|
# foreach ($we in $collection) {
|
||||||
|
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
|
#$domainNameCheck
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#EndRegion '.\public\Get-EffectoryDomainResources.ps1' 52
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
function Get-EffectoryDomainResources {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Find dangling DNS records
|
|
||||||
.DESCRIPTION
|
|
||||||
Compares DNS bindings with a previous state and checks the existence of DNS records for bindings that may have been deleted.
|
|
||||||
.PARAMETER subscriptionId
|
|
||||||
Optional Subscription Id to set the context to. Otherwise uses the current context.
|
|
||||||
#>
|
|
||||||
param(
|
|
||||||
[Parameter()]
|
|
||||||
[string] $subscriptionId
|
|
||||||
)
|
|
||||||
|
|
||||||
$subscription = Get-AzContext
|
|
||||||
if (![string]::IsNullOrWhitespace($subscriptionId)) {
|
|
||||||
$subscription = Set-AzContext -SubscriptionId $subscriptionId
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Write-Host "foo"
|
|
||||||
}
|
|
||||||
8
Powershell/Modules/Effectory.Dns/test.csv
Normal file
8
Powershell/Modules/Effectory.Dns/test.csv
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
"SubscriptionId","SubscriptionName","ResourceId","ResourceGroupName","ResourceName","ResourceType","DomainName","Tag_Team","Tag_Product","Tag_Environment","Tag_Data"
|
||||||
|
"a134faf1-7a89-4f2c-8389-06d00bd5e2a7","Survey Software Production (a134faf1-7a89-4f2c-8389-06d00bd5e2a7) - jurjen.ladenius@effectory.com","/subscriptions/a134faf1-7a89-4f2c-8389-06d00bd5e2a7/resourcegroups/my-effectory-europe/providers/Microsoft.Network/Frontdoors/my-effectory/FrontendEndpoints/my-effectory-com","my-effectory-europe","my-effectory-com","Microsoft.Network/Frontdoors/FrontendEndpoints","my.effectory.com","yellow","my-effectory","prod","n/a"
|
||||||
|
"a134faf1-7a89-4f2c-8389-06d00bd5e2a7","Survey Software Production (a134faf1-7a89-4f2c-8389-06d00bd5e2a7) - jurjen.ladenius@effectory.com","/subscriptions/a134faf1-7a89-4f2c-8389-06d00bd5e2a7/resourcegroups/my-effectory-europe/providers/Microsoft.Network/Frontdoors/my-effectory/FrontendEndpoints/my-internetspiegel-effectory-com","my-effectory-europe","my-internetspiegel-effectory-com","Microsoft.Network/Frontdoors/FrontendEndpoints","my.internetspiegel.effectory.com","yellow","my-effectory","prod","n/a"
|
||||||
|
"a134faf1-7a89-4f2c-8389-06d00bd5e2a7","Survey Software Production (a134faf1-7a89-4f2c-8389-06d00bd5e2a7) - jurjen.ladenius@effectory.com","/subscriptions/a134faf1-7a89-4f2c-8389-06d00bd5e2a7/resourcegroups/my-effectory-europe-staging/providers/Microsoft.Network/Frontdoors/stage-my-effectory/FrontendEndpoints/stage-my-internetspiegel-effectory-com","my-effectory-europe-staging","stage-my-internetspiegel-effectory-com","Microsoft.Network/Frontdoors/FrontendEndpoints","stage-my.internetspiegel.effectory.com","yellow","my-effectory","prod","n/a"
|
||||||
|
"a134faf1-7a89-4f2c-8389-06d00bd5e2a7","Survey Software Production (a134faf1-7a89-4f2c-8389-06d00bd5e2a7) - jurjen.ladenius@effectory.com","/subscriptions/a134faf1-7a89-4f2c-8389-06d00bd5e2a7/resourcegroups/my-effectory-europe-staging/providers/Microsoft.Network/Frontdoors/stage-my-effectory/FrontendEndpoints/stage-my-effectory-com","my-effectory-europe-staging","stage-my-effectory-com","Microsoft.Network/Frontdoors/FrontendEndpoints","stage-my.effectory.com","yellow","my-effectory","prod","n/a"
|
||||||
|
"a134faf1-7a89-4f2c-8389-06d00bd5e2a7","Survey Software Production (a134faf1-7a89-4f2c-8389-06d00bd5e2a7) - jurjen.ladenius@effectory.com","/subscriptions/a134faf1-7a89-4f2c-8389-06d00bd5e2a7/resourceGroups/Default-Storage-WestEurope/providers/Microsoft.Storage/storageAccounts/mailingstore","Default-Storage-WestEurope","mailingstore","Microsoft.Storage/storageAccounts","mailstore.effectory.com","pink","general","prod","internal"
|
||||||
|
"a134faf1-7a89-4f2c-8389-06d00bd5e2a7","Survey Software Production (a134faf1-7a89-4f2c-8389-06d00bd5e2a7) - jurjen.ladenius@effectory.com","/subscriptions/a134faf1-7a89-4f2c-8389-06d00bd5e2a7/resourcegroups/my-effectory-europe/providers/Microsoft.Cdn/profiles/effectorybranding/endpoints/effectorybranding/customdomains/styleguide-effectory-com","my-effectory-europe","styleguide-effectory-com","Microsoft.Cdn/profiles/endpoints/customdomains","styleguide.effectory.com","orange","my-effectory","prod","n/a"
|
||||||
|
"a134faf1-7a89-4f2c-8389-06d00bd5e2a7","Survey Software Production (a134faf1-7a89-4f2c-8389-06d00bd5e2a7) - jurjen.ladenius@effectory.com","/subscriptions/a134faf1-7a89-4f2c-8389-06d00bd5e2a7/resourcegroups/tech-effectory/providers/Microsoft.Cdn/profiles/tech-effectory/endpoints/techeffectory/customdomains/tech-effectory-com","tech-effectory","tech-effectory-com","Microsoft.Cdn/profiles/endpoints/customdomains","tech.effectory.com","to","tech.effectory.com","prod","public"
|
||||||
|
23
Powershell/Modules/Effectory.Dns/testscript.ps1
Normal file
23
Powershell/Modules/Effectory.Dns/testscript.ps1
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#using module .\build\Effectory.Dns\0.0.1\Effectory.Dns.psm1
|
||||||
|
|
||||||
|
# .\build.ps1
|
||||||
|
|
||||||
|
# Import-Module .\build\Effectory.Dns\0.0.1\Effectory.Dns.psm1 -Force
|
||||||
|
|
||||||
|
|
||||||
|
Import-Module .\Effectory.Dns -Force
|
||||||
|
|
||||||
|
# $subscriptions = Get-AzSubscription | Where-Object State -eq "Enabled"
|
||||||
|
|
||||||
|
# foreach ($subscription in $subscriptions)
|
||||||
|
# {
|
||||||
|
# [Object[]]$result = @()
|
||||||
|
# $items = Get-EffectoryDomainResources -subscriptionId $subscription.Id
|
||||||
|
# $result = $result + $items
|
||||||
|
# }
|
||||||
|
|
||||||
|
# $result
|
||||||
|
|
||||||
|
$result = Get-EffectoryDomainResources -subscriptionId "a134faf1-7a89-4f2c-8389-06d00bd5e2a7"
|
||||||
|
|
||||||
|
$result | Export-Csv -Path "test.csv"
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
Import-Module .\Effectory.Dns
|
|
||||||
|
|
||||||
Get-EffectoryDomainResources
|
|
||||||
Reference in New Issue
Block a user