Как программно найти виртуальные машины с неограниченным SSH-соединением?

Мне нужно получить список виртуальных машин с неограниченным SSH.

Я просматривал документацию Azure SDK для Python. Существует класс SshConfiguration в вычислительном модуле, но он содержит информацию только об открытых ключах. Существует другой класс SshConfiguration в пакетном модуле AI, который можно использовать для получения списка общедоступных IP-адресов, которым разрешено подключение, что мне и нужно. Но я не использую пакетный ИИ.

Как я могу получить нужную мне информацию программно?


person supernova    schedule 18.12.2019    source источник


Ответы (1)


Для этого вам придется пойти в обход, так как в модуле Compute нет прямого метода, который напрямую дает эту информацию.

Используя методы модулей Compute и Network, я написал следующий сценарий, чтобы перечислить все виртуальные машины в подписке с неограниченным доступом по SSH, т. е. перечислить все правила входящего трафика, разрешающие доступ к виртуальной машине через порт 22 из Интернета.

# Imports
from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.network import NetworkManagementClient
from azure.mgmt.compute import ComputeManagementClient

# Set subscription ID
SUBSCRIPTION_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'


def get_credentials():
    credentials = ServicePrincipalCredentials(
        client_id='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
        secret='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
        tenant='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    )

    return credentials


# Get credentials
credentials = get_credentials()

# Initialize management client
network_client = NetworkManagementClient(
    credentials,
    SUBSCRIPTION_ID
)

# Initialize management client
compute_client = ComputeManagementClient(
    credentials,
    SUBSCRIPTION_ID
)


def get_unrestricted_ssh_rules():

    print('\nListing all VMs in Subscription with unrestricted SSH access:')
    for vm in compute_client.virtual_machines.list_all():
        # Get the VM Resource Group name
        vm_rg_name = vm.id.split('/')[4]

        # Loop through NICs
        for nic in vm.network_profile.network_interfaces:
            # Get the NIC name and Resource Group
            nic_name = nic.id.split('/')[-1]
            nic_rg_name = nic.id.split('/')[4]

            # Get the associated NSG and its Resource Group
            nsg = network_client.network_interfaces.get(
                nic_rg_name, nic_name).network_security_group

            nsg_name = nsg.id.split('/')[-1]
            nsg_rg_name = nsg.id.split('/')[4]

            # Get the associated Security Rules
            for rule in network_client.security_rules.list(nsg_rg_name, nsg_name):
                # Conditions:
                # Rule direction: Inbound
                # Rule Access: Allow
                # Port: 22
                # Source Address Prefix: 'Internet' or '*'

                unrestricted = (rule.direction == 'Inbound' and rule.access == 'Allow' and ('22' in (rule.destination_port_ranges, rule.destination_port_range)
                                or rule.destination_port_range == '*') and (rule.source_address_prefix == '*' or rule.source_address_prefix == 'Internet'))
                # Print all the Inbound rules allowing access to the VM over port 22 from the Internet
                if unrestricted:
                    print "\nVM Name: ", vm.name, "\nResource Group Name: ", vm_rg_name, "\nRule Name: ", rule.name


# List all VMs in the Subscription with unrestricted SSH access
get_unrestricted_ssh_rules()

Вы можете повторить то же самое с подсетями, если NSG связана с подсетью, а не с сетевой картой.

Ссылки:

Надеюсь это поможет!

person Bhargavi Annadevara    schedule 25.12.2019