LINUX.ORG.RU
ФорумAdmin

Как узнать username или uid по IP удалённого хоста?

 , ,


0

2

Здравствуйте.

У нас сеть состоит из множества тонких клиентов с файловой системой read only. Пользователи работают на виртуальных машинах. Аутентификация двойная - сначала на тонком клиенте, затем в системе виртуализации. IP статические. ОС - RHEL 6.4. Задача - отображать IP тонких клиентов в username залогинившегося пользователя и наоборот. И периодически обновлять матрицу соответствия.

Есть некоторые идеи...

1. Попытаться заставить терминальный сервер (раздаёт образы ОС и поддерживает DHCP) вести логи с указанием username/uid. Написать демон, который будет отслеживать обновление лога и обновлять матрицу.

2. Смонтировать образ OC так, чтобы на все клиенты ушёл один и тот же публичный ключ, затем опять же написать демон, который будет заходит по SSH на все клиенты и там вызывать who.

3. Периодически опрашивать клиенты по SNMP. Якобы версия SNMPv3 позволяет запросить username (или это не тот username? :)

Как обычно, хотелось бы выбрать наименее трудоёмкий путь. Из языков лучше Python, менее предпочтительны C++, bash. Спасибо.

SNMPv3 позволяет запросить username (или это не тот username?

Ты всё перепутал. Это аутентификация в snmp

router ★★★★★
()

да подними ты DNS так, чтобы hostname == username!

Anon
()

Есть сильное подозрение, что производитель тонких клиентов уже позаботился об аудите доступа. Почитай документацию или спроси на форуме производителя

router ★★★★★
()

А, дошло: пользователь может на любом клиенте залогиниться?

Тогда делай для login обертку, которая будет uid пользователя с IP куда-нибудь записывать.

А вообще, что: команда w на сервере не показывает с какого IP клиент зашел?

Anon
()
Ответ на: комментарий от Anon

А, дошло: пользователь может на любом клиенте залогиниться?

Да, клиенты не привязаны к пользователям, можно на любом залогиниться.

Тогда делай для login обертку, которая будет uid пользователя с IP куда-нибудь записывать.

В каком смысле обёртку для login? Распотрошить аутентификацию в RedHat и что-то переписать?

А вообще, что: команда w на сервере не показывает с какого IP клиент зашел?

Нет, команда w даёт информацию лишь по тем пользователям, которые аутентифицировались на сервере (терминальном или гипервизоре), например, админы. Все остальные пользователи логинятся не на сервере, разумеется, поэтому и w их не обнаружит.

vitalyisaev2
() автор топика
Ответ на: комментарий от vitalyisaev2

В каком смысле обёртку для login? Распотрошить аутентификацию в RedHat и что-то переписать?

/etc/pam.d/login, например.

cx ★★
()
Ответ на: комментарий от Anon

Хомяк никуда не монтируется :) 1. Юзеры включают клиент, получают от терминального сервера образ системы, вводят логин и пароль, заходят на клиент. 2. Включают Firefox, заходят на гипервизор виртуальных машин, вводят логин и пароль, и получают свою именную виртуалку. Работа с ней ведётся через Firefox по протоколу SPICE.

Вся аутентификация ведётся Red Hat Identity Management Server (другое название - FreeIPA).

vitalyisaev2
() автор топика
Ответ на: комментарий от vitalyisaev2

Жуть-то какая! Ну, кто это накрутил, тот пусть и разбирается.

Anon
()
Ответ на: комментарий от vitalyisaev2

если виртуализация на ovirt то все это решалось вполне штатно. и авторизация в IPA там централизованная, не надо дважды логиниться

dyasny ★★★★★
()
Ответ на: комментарий от dyasny

Очень интересно, о таком не слышал. А как можно настроить сквозную аутентификацию на IPA?

Виртуализация через Red Hat Enterprise Virtualisation, то есть действительно через ovirt. Читал мануалы по RHEV, но ничего подобного нет, то есть нельзя через его API выцепить, на каком именно устройстве сейчас работает та или иная виртуальная машина

vitalyisaev2
() автор топика
Ответ на: комментарий от vitalyisaev2

точнее, с какого именно устройства осуществляется доступ к виртуальной машине

vitalyisaev2
() автор топика
Ответ на: комментарий от vitalyisaev2

ну если RHEV то все еще проще. тонкие терминалы должны иметь возможность авторизоваться в IPA, a потом те же юзер/пасс входят в user portal, через SSO (часть сервисов установленных в VM) попадают в VM.

насчет подключения, в API должен быть clientIP, я сам фичер реквест вводил еще год назад, когда участвовал в разработке. vdsm этот IP точно знает так-что engine просто должен его собирать с хостов и выкладывать в API. временно можно брать его напрямую из vdsclient getAllVmStats

dyasny ★★★★★
()
Ответ на: комментарий от dyasny

Спасибо, это просто здорово. Особенно необычно слышать про возможность проброса credentials в среду виртуализации. Мы уже свыклись с тем, что логин и пароль вводим дважды, и кто-то из старожилов писал в RedHat - разработчики якобы ответили, что сквозная аутентификация в RHEV через IPA невозможна.

А последнее - getAllVmStats - доступно через RestAPI гипервизора?

vitalyisaev2
() автор топика
Ответ на: комментарий от vitalyisaev2

по пунктам:

- SSO работает следующим образом: 1) клиент логинится в юзер портал и жмет на кнопку подключения к ВМ 2) его юзер и пароль передаются в SSO сервис на самой ВМ (по каналу engine-vdsm) и автоматически отпирают сессию. У нас это всегда работало с AD, и с IPA тоже должно

- getAllVmStats это внутренний API vdsm, на самом хосте. В принципе эта команда выполняется каждые две секунды и результаты уходят к engine, но когда я этим занимался (2.1-3.1) не вся информация обрабатывалась и попадала в restapi, что я тогда заметил и открыл фичер реквест. Если это все еще не исправили, (надо глянуть в restapi раздел какой нибудь работающей десктоп-ВМ) то можно сoбирать информацию самому по ssh, думаю раз в 5 минут будет достаточно

dyasny ★★★★★
()
Ответ на: комментарий от dyasny

Вы не могли бы подсказать, почему в выводе этой команды нет ни одного IP адреса? Может, гипервизор не настроен?

Запускаю на гипервизоре

vdsClient -s 0 getAllVmStats

b2dbf4f6-0cfc-495b-afea-78defcff606b Status = Up username = Unknown memUsage = 0 acpiEnable = true session = Unknown displaySecurePort = 5903 timeOffset = -43200 balloonInfo = {'balloon_max': 1048576, 'balloon_cur': 1048576} pauseCode = NOERR network = {'vnet1': {'macAddr': '00:1a:4a:02:37:9a', 'rxDropped': '0', 'txDropped': '0', 'rxErrors': '0', 'txRate': '6.2', 'rxRate': '0.2', 'txErrors': '0', 'state': 'unknown', 'speed': '1000', 'name': 'vnet1'}} vmType = kvm cpuUser = 10.78 elapsedTime = 6182024 displayType = qxl cpuSys = 6.66 appsList = [] hash = -1941471795669821764 pid = 4862 displayIp = 0 displayPort = 5902 guestIPs = kvmEnable = true disks = {'vda': {'readLatency': '110650319', 'apparentsize': '42949672960', 'writeLatency': '176529978', 'imageID': 'ff395ca2-4e5f-479c-875e-4e317f9dca39', 'flushLatency': '129763', 'readRate': '1511535.72', 'truesize': '40718544896', 'writeRate': '1772.50'}, 'hdc': {'readLatency': '0', 'apparentsize': '0', 'writeLatency': '0', 'flushLatency': '0', 'readRate': '0.00', 'truesize': '0', 'writeRate': '0.00'}} monitorResponse = 0 statsAge = 0.47 clientIp =

f95cc308-026d-4921-9866-c33f33ccab6b Status = Up username = Unknown memUsage = 0 acpiEnable = true session = Unknown displaySecurePort = 5901 timeOffset = 14439 balloonInfo = {'balloon_max': 1048576, 'balloon_cur': 1048576} pauseCode = NOERR network = {'vnet0': {'macAddr': '00:1a:4a:02:37:30', 'rxDropped': '0', 'txDropped': '0', 'rxErrors': '0', 'txRate': '0.0', 'rxRate': '0.0', 'txErrors': '0', 'state': 'unknown', 'speed': '1000', 'name': 'vnet0'}} vmType = kvm cpuUser = 1.36 elapsedTime = 3433756 displayType = qxl cpuSys = 0.00 appsList = [] hash = -8648600766290227900 pid = 24397 displayIp = 0 displayPort = 5900 guestIPs = kvmEnable = true disks = {'vda': {'readLatency': '0', 'apparentsize': '10737418240', 'writeLatency': '7142188', 'imageID': '7d33c4f4-8041-4237-b11d-7f5886d11e83', 'flushLatency': '105004', 'readRate': '0.00', 'truesize': '4463267840', 'writeRate': '7158.77'}, 'hdc': {'readLatency': '0', 'apparentsize': '0', 'writeLatency': '0', 'flushLatency': '0', 'readRate': '0.00', 'truesize': '0', 'writeRate': '0.00'}} monitorResponse = 0 statsAge = 1.53 clientIp =

0087dc2a-e3ee-4db2-adca-e44348d20ce3 Status = Up username = Unknown memUsage = 0 acpiEnable = true session = Unknown displaySecurePort = 5905 timeOffset = 43180 balloonInfo = {'balloon_max': 3145728, 'balloon_cur': 3145728} pauseCode = NOERR network = {'vnet2': {'macAddr': '00:1a:4a:02:37:9d', 'rxDropped': '0', 'txDropped': '0', 'rxErrors': '0', 'txRate': '0.0', 'rxRate': '0.0', 'txErrors': '0', 'state': 'unknown', 'speed': '1000', 'name': 'vnet2'}} vmType = kvm cpuUser = 5.93 elapsedTime = 413060 displayType = qxl cpuSys = 11.19 appsList = [] hash = 5184248632951019355 pid = 14470 displayIp = 0 displayPort = 5904 guestIPs = kvmEnable = true disks = {'vda': {'readLatency': '0', 'apparentsize': '64424509440', 'writeLatency': '10339428', 'imageID': '38205969-1faf-4fc9-8b8d-73e32935b686', 'flushLatency': '144483', 'readRate': '0.00', 'truesize': '7891132416', 'writeRate': '7022.23'}, 'hdc': {'readLatency': '0', 'apparentsize': '0', 'writeLatency': '0', 'flushLatency': '0', 'readRate': '0.00', 'truesize': '0', 'writeRate': '0.00'}} monitorResponse = 0 statsAge = 1.96 clientIp =

9a63ebb5-2944-4c67-bc32-cf3c170f3faa Status = Up username = Unknown memUsage = 0 acpiEnable = true session = Unknown displaySecurePort = 5909 timeOffset = -2 balloonInfo = {'balloon_max': 4194304, 'balloon_cur': 4194304} pauseCode = NOERR network = {'vnet4': {'macAddr': '00:1a:4a:02:37:9e', 'rxDropped': '0', 'txDropped': '0', 'rxErrors': '0', 'txRate': '0.0', 'rxRate': '12.0', 'txErrors': '0', 'state': 'unknown', 'speed': '1000', 'name': 'vnet4'}} vmType = kvm cpuUser = 56.46 elapsedTime = 835 displayType = qxl cpuSys = 12.45 appsList = [] hash = 150731758585611147 pid = 1562 displayIp = 0 displayPort = 5908 guestIPs = kvmEnable = true disks = {'vda': {'readLatency': '363361606', 'apparentsize': '42949672960', 'writeLatency': '156116795', 'imageID': '480c22d8-e982-4865-9895-fb6fc6466d18', 'flushLatency': '267820419', 'readRate': '41668.29', 'truesize': '38954721280', 'writeRate': '1628.73'}, 'vdc': {'readLatency': '0', 'apparentsize': '107374182400', 'writeLatency': '0', 'imageID': '54900869-e09a-4a3f-be45-6b1f801f463d', 'flushLatency': '0', 'readRate': '0.00', 'truesize': '97091018752', 'writeRate': '0.00'}, 'vdb': {'readLatency': '356935240', 'apparentsize': '53687091200', 'writeLatency': '90669219', 'imageID': '1f3cd4ef-3257-4e20-a3e1-1dc6cb3f0d1c', 'flushLatency': '63677503', 'readRate': '203.59', 'truesize': '21054345216', 'writeRate': '71517991.19'}, 'hdc': {'readLatency': '0', 'apparentsize': '0', 'writeLatency': '0', 'flushLatency': '0', 'readRate': '0.00', 'truesize': '0', 'writeRate': '0.00'}} monitorResponse = 0 statsAge = 1.70 clientIp =

vitalyisaev2
() автор топика
Ответ на: комментарий от vitalyisaev2

может сломали функционал... все отлично пахало в 3.0 и 3.1

надо открыть кейс в саппорте, накапать им на мозги, тем более что там половина команды русскоязычные

dyasny ★★★★★
()
Ответ на: комментарий от dyasny

Отчасти у нас получилось. Мы поставили на виртуальные машины пакет rhevm-guest-agent, запустили демон ovirt и смогли вытащить через API RHEV менеджера IP виртуальных машин.

Но нам нужен ещё и IP физических машин, с которых на виртуалки производится доступ.

vitalyisaev2
() автор топика
Ответ на: комментарий от vitalyisaev2

кейс открыли? это на самом деле был вполне рабочий функционал, если его где-то сломали и не заметили, то должны починить

dyasny ★★★★★
()
Ответ на: комментарий от vitalyisaev2

Client IP можно взять из базы менеджера или грепнуть из вывода vdsClient -s 0 getAllVmStats с хостов. Первое, конечно, проще, но советую завести специального ro юзера, от лукавого.

gryberg
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.