Один из наших производственных серверов был «клонирован» для создания вторичной тестовой среды. Исходный сервер - это виртуальная машина (среда VMWare vSphere), присоединенная к домену и имеющая статический IP-адрес.
Когда клонированная виртуальная машина была включена, виртуальный сетевой адаптер был включен. Имя компьютера не изменилось. IP-адреса тоже не было. Каким-то образом эти два сервера с одинаковым DNS-именем и IP-адресом сосуществовали в одном домене в течение нескольких дней - может быть, целую неделю. Какое-то время мы будем заняты устранением повреждений ...
Будь то невнимательность или незнание, люди совершают ошибки. Я могу это принять. Так что давайте предположим, что это может повториться снова. Я знаю, как решить проблему. Но как это обнаружить?
РЕДАКТИРОВАТЬ
Я не ищу инструкций или советов о том, как клонировать виртуальную машину. Это задание не мне дано. Я хочу знать, как быстро (или немедленно) определить, когда два компьютера / рабочие станции / виртуальные машины имеют одинаковое DNS-имя.
ОБНОВИТЬ
Я решил запустить «проверку» при запуске основной службы SQL Server, которая попытается определить, был ли клонирован хост SQL. (Обратите внимание, что эта тактика применима только к виртуальным машинам, которые являются узлами SQL Server.)
TL; DR: жестко запрограммируйте имя хост-машины SQL и домен в сохраненной процедуре и сравните эти значения с SERVERPROPERTY(N'MachineName')
и DEFAULT_DOMAIN()
. Сделайте что-нибудь радикальное, если значения не совпадают.
Если кому интересно, я писал об этом в блоге: SQL Server: Атака клонов
Последние мысли
Наверное, мне следовало упомянуть об этом, когда я изначально задавал вопрос: я - администратор баз данных SQL Server. Хотя я не являюсь системным администратором, я работаю с ними. Я не в одной «команде» с системными администраторами, но и я не отгорожен от них. Я ценю вклад и многочисленные ответы на мой вопрос. Большинство указывало, что проблема связана с обучением, и я должен обучить тех, кто в ней участвует. Я не могу не согласиться. Это разумный и проактивный подход. Но ... почти все, что находится за пределами области SQL Server, находится вне моего контроля. Сисадмины приходят и уходят. Они действуют и принимают решения независимо от моих желаний и потребностей. Однако я контролирую, что происходит с точки зрения SQL Server. Я все еще могу действовать на опережение даже после того, как дело сделано. Поскольку мое домашнее решение зависит от SQL Server, сейчас очевидно, я должен был разместить свой вопрос на https://dba.stackexchange.com/ Я думаю, что вопрос здесь все же имеет значение, но если модератор захочет перенести его, я понимаю.
Когда вы клонируете виртуальную машину в среде vSphere, у вас есть возможность "настроить гостя" при клонировании или развертывании виртуальных машин из шаблона ...
Здесь вы можете указать имя, изменить настройки сети, указать членство в домене и сгенерировать новый SID. (для операционных систем Microsoft). Это все, что вам нужно сделать в будущем.
Скорее всего, в программе просмотра событий были журналы, указывающие на конфликты IP-адресов. Любая система мониторинга, которая собирает и фильтрует журналы событий, должна уметь обнаруживать это и запускать предупреждения.
На физических управляемых коммутаторах вы, вероятно, могли бы обнаружить повторяющийся MAC-адрес и предупредить о нем - я недостаточно знаком с виртуальными коммутаторами vmware, чтобы знать, какие варианты у вас могут быть там.
Конечно, реальное решение - это надлежащее обучение всех, кто участвует в клонировании, чтобы убедиться, что этого не произойдет в первую очередь - клонирование виртуальной машины должно выполняться очень осторожно, с изменением IP-адреса или переходом в изолированную сеть, чтобы избежать именно такой ситуации.
Надеюсь, одна машина «выиграла» все время, и изменения не распространились на оба сервера!
Ничто не заменит хорошую политику управления IP. Конец. Плавник. FIN-ACK.
Независимо от контекста, нет никакого способа предотвратить глупость людей с IP-адресами, если только программное обеспечение не сделает все возможное, чтобы запретить это - а обычно это невозможно. Откуда он знает, что ты не необходимость несколько виртуальных машин для хранения этих адресов, и будут ли подключаться к сети только одна из них за раз? Это не задача программного обеспечения - контролировать это. Задача администратора - ценить свою работу настолько, чтобы не создавать перебоев в работе из-за конфликта IP-адресов.
Это один из тех уроков, которые администраторы должны усвоить, будь то на собственном горьком опыте или из-за неизбежной паники в 3 часа ночи, которая случается, когда другие люди учатся на собственном горьком опыте.
tl; dr, никто не умнее IPAM. Назначение IP-адреса или клонирование устройства - это религиозная функция, которая должна сопровождаться благословением IPAM. Вера в языческие обычаи, предназначенные для предотвращения или смягчения конфликтов интеллектуальной собственности, приведет только к предопределенной гибели. Игнорируйте его божественное руководство на свой страх и риск.
(Я понимаю то, что вы пытаетесь сделать. Я действительно понимаю и уважаю это. Но нет другого решения, кроме страх со стороны тех, кто хочет сохранить свою работу.)
Я согласен с комментариями о том, что технология создания этих клонов нуждается в некотором перевоспитании. Возможно, какой-то ответный удар с вашей стороны, особенно если тестовые серверы находятся в той же сети, что и производственные серверы.
В то же время это может помочь вам идентифицировать гостевые виртуальные машины с повторяющимися IP-адресами, уже присутствующими в вашей среде. Вам понадобится PowerCli, и имейте в виду, что члены кластера изначально используют один и тот же IP-адрес.
$vcserver = "your-vcenter-server-name"
Add-PSsnapin VMware.VimAutomation.Core
Connect-VIServer $vcserver
$results = Get-VM | Select -ExpandProperty Guest | % {
$name = $_.HostName
$_.IPAddress | % {
New-Object PSObject -Property @{
HostName = $name
IP = $_
}
}
}
Disconnect-VIServer
Затем найдите дубликаты с помощью этот:
$count = @{}
$results | % { $count["$($_.IP)"] += 1 }
$count.Keys | ? { $count["$_"] -gt 1 } | % {
$dup = $_
$results | ? { $_.IP -eq $dup }
} | ft