The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]



"Инцидент в сервисе непрерывной интеграции Travis CI"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от opennews (??) on 09-Апр-18, 11:59 
Разработчики сервиса непрерывной интеграции Travis CI (https://travis-ci.org/) раскрыли сведения (https://blog.travis-ci.com/2018-04-03-incident-post-mortem) об инциденте с повреждением инфраструктуры проекта 13 марта, в результате которого случайно была инициирована операция удаления всех таблиц из СУБД. В течение 30 минут после удаления сервис оставался доступен с повреждёнными данными, после чего был отключен на пять с половиной часов для проведения восстановления.


После восстановления всплыл неожиданный эффект - пользователи которые подключились к сервису за те 30 минут, что база оставалась повреждена, оказались подключенными под совсем другими аккаунтами. Подобный эффект объясняется тем, что для пользователей, которые вошли при пустой БД, были созданы новые записи и первичные ключи (данные в Travis CI синхронизируются с GitHub). После восстановления новые токены аутентификации не были очищены и стали указывать на совсем другие записи. После того как проблема была замечена, разработчики Travis CI примерно через сутки после очистки БД удалили проблемные токены и по логу всего один пользователь успел подключиться к чужим данным. Тем не менее, всем этим пользователям было направлено уведомление с предложением сгенерировать новые токены доступа.


Что касается причины удаления всех данных, то она кроется в давно забытом сеансе tmux на одной из рабочих машин проекта - когда-то давно один из разработчиков выполнял в данном сеансе инспектирование основной базы и оставил выставленной переменную окружения DATABASE_URL, указывающую на первичную БД. Много дней спустя разработчик в том же сеансе запустил локальный тест, в котором вызывался скрипт Database Cleaner (https://github.com/DatabaseCleaner/database_cleaner), выполняющий очистку всех таблиц пред генерацией тестовой нагрузки. Так как переменная окружения DATABASE_URL указывала на основную СУБД, то и очистка была запущена в контексте первичной БД.


Для того чтобы подобное не повторилось в будущем в БД было отозвано право очистки таблиц. Во внутренние скрипты добавлен обработчик (spec_helpers), проверяющий наличие переменной окружения DATABASE_URL,   а в утилитах обеспечен вывод соответствующего предупреждения. В
gem-пакет Database Cleaner добавлена проверка на наличие переменной DATABASE_URL.

URL: https://blog.travis-ci.com/2018-04-03-incident-post-mortem
Новость: https://www.opennet.ru/opennews/art.shtml?num=48414

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Инцидент в сервисе непрерывной интеграции Travis CI"  +18 +/
Сообщение от Аноним (??) on 09-Апр-18, 11:59 
Красивая история :) Бывает когда нажмёшь энтер и через секунду мозг понимает что ты допустим в правилах фаервола допустил ошибку а уже придётся ехать :)
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

7. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от myhand (ok) on 09-Апр-18, 12:36 
iptables-apply в Debian уже десятилетие, наверное, но мозги продолжают ехать...
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

8. "Инцидент в сервисе непрерывной интеграции Travis CI"  +6 +/
Сообщение от Аноним (??) on 09-Апр-18, 12:45 
Он написал "допустим", так что ..
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "Инцидент в сервисе непрерывной интеграции Travis CI"  +3 +/
Сообщение от Еще анон on 09-Апр-18, 12:57 
> ..а уже придётся ехать :)

Причем, не просто ехать, а вот прям быстро-быстро ехать, пока звонки не начались!..

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

15. "Инцидент в сервисе непрерывной интеграции Travis CI"  –5 +/
Сообщение от Вы забыли заполнить поле Name on 09-Апр-18, 13:14 
Скорее очередная грустная история о хиптсерах, которые не могу настроить разграничение доступов.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

23. "Инцидент в сервисе непрерывной интеграции Travis CI"  +3 +/
Сообщение от ананим.orig on 09-Апр-18, 16:04 
да-да, нужно позвать эффектного манагера.
Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

19. "Инцидент в сервисе непрерывной интеграции Travis CI"  +21 +/
Сообщение от Anon123 on 09-Апр-18, 13:54 
Народная примета: удалённая настройка фаервола - к дороге.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

25. "Инцидент в сервисе непрерывной интеграции Travis CI"  –1 +/
Сообщение от kleem_head email on 09-Апр-18, 16:58 
это когда в правой панеле mc выделенные файлы ненужного бэкапа, а в правой - выделенные файлы удаленно подключенной боевой БД. Ты нажимаешь F8 -> Удалить все И СУДОРОЖНО ВСПОМИНАЕШЬ КАКАЯ ПАНЕЛЬ БЫЛА АКТИВНА.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

26. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от kleem_head email on 09-Апр-18, 16:59 
в левой и правой, попутался от остроты вспомненного
Ответить | Правка | ^ к родителю #25 | Наверх | Cообщить модератору

27. "Инцидент в сервисе непрерывной интеграции Travis CI"  +2 +/
Сообщение от Fomalhaut on 09-Апр-18, 17:07 
Нередко осознание приходит уже в процессе полёта пальца к кнопке, но сознание уже не успевает отозвать команду.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

29. "Инцидент в сервисе непрерывной интеграции Travis CI"  +2 +/
Сообщение от KonstantinB (ok) on 09-Апр-18, 17:34 
Купите IP-KVM или настройте аварийный PXE boot.

Хотя, может, вам ездить проще. Ну, не знаю. Когда датацентр в другой стране, вариант "ехать" вообще отсутствует. :)

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

30. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от klalafuda on 09-Апр-18, 17:41 
Ну если вы в Нижнем Уренгое а датацентр в Ларнаке... Может и не все так плохо
Ответить | Правка | ^ к родителю #29 | Наверх | Cообщить модератору

42. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Аноним (??) on 10-Апр-18, 07:56 
Нижний Уренгой? O_o
Ответить | Правка | ^ к родителю #30 | Наверх | Cообщить модератору

55. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Аноним (??) on 11-Апр-18, 01:16 
>  Красивая история :) Бывает когда нажмёшь энтер и через секунду мозг
> понимает что ты допустим в правилах фаервола допустил ошибку а уже придётся ехать :)

Я себе в таких случаях делаю "watchdog timer". Запускается нечто, что ожидает подтверждения моего присутствия. Допустим в пределах часа. Если я за час достукаться не смог - все возвращается в вид как было. Или в вид который заведомо работает.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

2. "Инцидент в сервисе непрерывной интеграции Travis CI"  +4 +/
Сообщение от Аноним (??) on 09-Апр-18, 12:02 
DATABASE_URL указывала на основную СУБД (смех нельсона)
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от Аноним (??) on 09-Апр-18, 12:16 
"бывает"
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от rshadow (ok) on 09-Апр-18, 12:32 
Не хватает на опеннете стикеров, да?
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "Инцидент в сервисе непрерывной интеграции Travis CI"  +2 +/
Сообщение от Gremlin (??) on 09-Апр-18, 12:32 
Никогда не понимал все эти сервисы непрерывной интеграции. Зачем это? Интеграция ради интеграции? А когда же отдыхать?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

9. "Инцидент в сервисе непрерывной интеграции Travis CI"  +5 +/
Сообщение от Аноним (??) on 09-Апр-18, 12:52 
>  Никогда не понимал все эти сервисы непрерывной интеграции. Зачем это?

Серьезно? Непонятно зачем автоматизировать то, что можно автоматизировать?
Хотя бы ради того, чтобы не тратить свое время на прогон всех тестов и
чтобы каждый гарантировать что каждый коммит компилируется, чтобы
git bisect нормально работал.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

14. "Инцидент в сервисе непрерывной интеграции Travis CI"  –6 +/
Сообщение от пох on 09-Апр-18, 13:13 
это вы CT описали.
А travis это все же больше к CI, и там выгоды от "автоматизации" ненужной деятельности не всегда перевешивают минусы. (ci =!= автодеплой) Скорее речь, как всегда, об "экономии времени" альтернативно-одаренных кодошлепов и их горе-тимлидов на нормальный release-management, скорей, скорей, смузи скиснет! (а там девопы как-то подлатают - больше падучих узлов запустят, или автоподнималку ускорят. Админ из такой конторы уволился пять лет назад.)

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Инцидент в сервисе непрерывной интеграции Travis CI"  +2 +/
Сообщение от llolik (ok) on 09-Апр-18, 12:58 
> Никогда не понимал все эти сервисы непрерывной интеграции

Чего там не понимать-то? Если совсем упрощённо - это автомат, который работает по схеме: закоммитили в наблюдаемую ветку -> CI собирает проект -> не собралось - плохо, ищем что сломалось (логи и отчёты в помощь) / собралось - хорошо, CI гоняет автотесты -> тесты где-то сфейлились - плохо, но хотя бы собирется, выясняем где фейлы (логи и отчёты тестов в помощь) / тесты успешны - можно деплоиться или что-там ещё делать по желанию -> далее по кругу с первого шага.

> Зачем это?

Затем, чтобы не делать всё это вручную.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

31. "Инцидент в сервисе непрерывной интеграции Travis CI"  +2 +/
Сообщение от klalafuda on 09-Апр-18, 17:44 
> Чего там не понимать-то? Если совсем упрощённо - это автомат, который работает
> по схеме: закоммитили в наблюдаемую ветку -> CI собирает проект ->
> не собралось - плохо, ищем что сломалось (логи и отчёты в
> помощь) / собралось - хорошо, CI гоняет автотесты -> тесты где-то
> сфейлились - плохо, но хотя бы собирется, выясняем где фейлы (логи
> и отчёты тестов в помощь) / тесты успешны - можно деплоиться
> или что-там ещё делать по желанию -> далее по кругу с
> первого шага.

Это хорошо можно прочувствовать только если проект собирается/прогоняется под N разных платформ и даже сборка не то что прогон под каждую из них занимает существенное время.

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от myhand (ok) on 09-Апр-18, 13:12 
Ага.  А писание рукой (не путать с рукоблудием!), причем православными школьными чернилами - "развивает мелкую моторику" (тм).

Никогда не понимал тех, кто живет не в шалаше или сырой пещере, как "близкие к природе" предки...

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

40. "Инцидент в сервисе непрерывной интеграции Travis CI"  –2 +/
Сообщение от Michael Shigorin email(ok) on 09-Апр-18, 23:30 
> Ага.  А писание рукой (не путать с рукоблудием!),
> причем православными школьными чернилами -
> "развивает мелкую моторику" (тм).

А уж когда лекцию наговаривают, не особо тормозя на поворотах (как у нас в лицее) -- так ещё и навыки сжатия на лету развиваются буквально за пару недель.  Не путать с путаньем всего со всем.

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

44. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от myhand (ok) on 10-Апр-18, 12:14 
>> "развивает мелкую моторику" (тм).
> А уж когда лекцию наговаривают, не особо тормозя на поворотах (как у
> нас в лицее) -- так ещё и навыки сжатия на лету развиваются буквально за пару недель.

Ну раз за пару - смело увольняйте "умников", которые каждый раз заново "наговаривают" то, чему место на 99% в слайдах презентации и готовых конспектах.


Ответить | Правка | ^ к родителю #40 | Наверх | Cообщить модератору

17. "Инцидент в сервисе непрерывной интеграции Travis CI"  +3 +/
Сообщение от anonymous (??) on 09-Апр-18, 13:26 
Если ты не понимаешь, зачем тебе CI, тогда тебе она не нужна. Ты не программист и не участвуешь в разработке многоплатформенного проекта с несколькими вариантами исполнения готового продукта.
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

20. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от Аноним (??) on 09-Апр-18, 14:05 
Наверное он не понимает, как можно доверять важные вещи какому-то мутному поделию, которое пилят забывашки сеансов, запускающие не глядя что попало, где попало и как попало, а ты уже раздухарился неуважение высказывать. Не помнишь штоли смешные истории про гитлаб, например?
Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

35. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Аноним (??) on 09-Апр-18, 19:41 
> как можно доверять важные вещи какому-то мутному поделию

да вы поехавшие. Какие вещи? "Доверять"? Это всего лишь триггер! "Условие выполнено - зеленый. Не выполнено - красный".

Я понимаю, что в вашей среде zip архивы вместо контроля версий и неделя на сборку версии и еще две на то, что бы обеспечить хоть какой-то запуск её - это норма. Но зачем же этим хвастаться

Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

36. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Аноним (??) on 09-Апр-18, 19:49 
ты новость-то читал?
Ответить | Правка | ^ к родителю #35 | Наверх | Cообщить модератору

37. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от пох on 09-Апр-18, 20:19 
это уровень понимания кодошлепами и их тимлидами как новостей, так и вообще используемых ими технологий.

зато у всех остальных, конечно же, зип и они "ничего не умеют".

Чем ci от ct отличается, похоже, тоже им не объяснили, давай-давай, проект не ждет пока ты разберешься в используемых тобой инструментах.

Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

46. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Аноним (??) on 10-Апр-18, 12:47 
ct? вы хотя бы аббревиатуры расшифровывайте что ли
Ответить | Правка | ^ к родителю #37 | Наверх | Cообщить модератору

47. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от Аноним (??) on 10-Апр-18, 13:12 
Вот да. CI знаю, CD знаю, CT — что-то внезапно родившееся в мозге нашего дражайшего поха. Не иначе как continuous testing (хотя CI включает и тестирование в том числе).
Ответить | Правка | ^ к родителю #46 | Наверх | Cообщить модератору

48. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от Аноним (??) on 10-Апр-18, 13:15 
> ты новость-то читал?

Отвал CI на несколько часов разработке не помеха, многие его наверняка вообще не заметили. Если такое случается раз в несколько лет, а не каждый день, то фигня.

Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

39. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от Michael Shigorin email(ok) on 09-Апр-18, 23:27 
> Никогда не понимал все эти сервисы непрерывной интеграции.
> Зачем это? Интеграция ради интеграции? А когда же отдыхать?

Когда дезинтегрируется, а чинить вон тому парню...

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

16. "Инцидент в сервисе непрерывной интеграции Travis CI"  +5 +/
Сообщение от Аноним (??) on 09-Апр-18, 13:18 
>  Много дней спустя разработчик в том же сеансе запустил локальный тест, в котором вызывался скрипт Database Cleaner, производящий очистку всех таблиц пред генерацией тестовой нагрузки.

А я вот всегда если вижу старый терминал -- делаю новый. Кто его знает какие там тараканы с пауками успели завестись.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

43. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от J.L. on 10-Апр-18, 11:59 
>>  Много дней спустя разработчик в том же сеансе запустил локальный тест, в котором вызывался скрипт Database Cleaner, производящий очистку всех таблиц пред генерацией тестовой нагрузки.
> А я вот всегда если вижу старый терминал -- делаю новый. Кто
> его знает какие там тараканы с пауками успели завестись.

а монитор из спящего включаете по пробелу/ентеру или по контролу?

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

52. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Вы забыли заполнить поле Name on 10-Апр-18, 14:45 
только NumLock, только хардкор
Ответить | Правка | ^ к родителю #43 | Наверх | Cообщить модератору

18. "Инцидент в сервисе непрерывной интеграции Travis CI"  +6 +/
Сообщение от YetAnotherOnanym (ok) on 09-Апр-18, 13:28 
Сеансы - это дефицитнейший ресурс! Их надо сохранять и многократно повторно использовать!
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

21. "Инцидент в сервисе непрерывной интеграции Travis CI"  +3 +/
Сообщение от Аноним (??) on 09-Апр-18, 14:07 
Мда,терминальные окна надо экономить, а то закончатся - придется покупать новые
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

41. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Michael Shigorin email(ok) on 09-Апр-18, 23:32 
> Мда,терминальные окна надо экономить, а то закончатся - придется покупать новые

Вот Вы ёрничаете, а у них, поди, терминальные лицензии и так заканчиваются.

PS: ну мне тоже решительно непонятно, как вообще можно лепить такой скрипт, не выставляя тестовое окружение в нём же самом... "defensive programming придумали трусы".

Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

45. "Инцидент в сервисе непрерывной интеграции Travis CI"  –2 +/
Сообщение от myhand (ok) on 10-Апр-18, 12:17 
У них тестовое окружение - на .org, который для "нищ*бродов" (Максим, ну это дикость, а не фильтры "неприемлемой лексики"!) и прочего опенсорса.

Кстати, вроде там ничего в тот раз не ломали.

Ответить | Правка | ^ к родителю #41 | Наверх | Cообщить модератору

22. "Инцидент в сервисе непрерывной интеграции Travis CI"  –2 +/
Сообщение от Адекват (ok) on 09-Апр-18, 14:40 
Представил такую ситуацию в гугл - "аккаунты всех пользователей удалены, потому что один из инженеров случайно стер бд с аккаунтами, теперь разобраться кому какие данные принадлежат - невозможно"
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

24. "Инцидент в сервисе непрерывной интеграции Travis CI"  +10 +/
Сообщение от Аноним (??) on 09-Апр-18, 16:57 
Восстановят из архивной копии АНБ.
Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору

33. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от АНБ on 09-Апр-18, 18:39 
> Восстановят из архивной копии АНБ.

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

Ответить | Правка | ^ к родителю #24 | Наверх | Cообщить модератору

32. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от Аноним (??) on 09-Апр-18, 18:29 
Инженеры гугла могут только скрывать, удалять запрещено решением АНБ. Та же ерунда с телеграмом дурова, но говорят что у дурова уже нет ключей шифрования (не об OTR речь).
Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору

34. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от АНБ on 09-Апр-18, 18:41 
> Инженеры гугла могут только скрывать, удалять запрещено решением АНБ

вот еще. Пусть хоть обудаляются - наша копия никуда не денется.

кстати, забавная идея, учитывая что акаунты всех гуглосервисов нынче объединены в единственную хранилку... (нет, вы не то подумали, мы не хотим потерять нашего замечательного информатора)

Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

38. "Инцидент в сервисе непрерывной интеграции Travis CI"  +1 +/
Сообщение от Аноним (??) on 09-Апр-18, 20:42 
>когда-то давно один из разработчиков
>Много дней спустя разработчик
>дней

Какая милая попытка загладить вину :)

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

49. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Аноним (??) on 10-Апр-18, 13:28 
Да какая разница, сколько времени эта сессия висела? Цимес не в этом, а в том, что разработчик руками что-то делает на проде. У Travis CI отсутствуют CI и CD то бишь. Сапожники без сапог.
#авосьпронесёт #яжнедурак
Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

56. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от zoonman (ok) on 11-Апр-18, 01:23 
Вполне себе нормальная ситуация, когда разработчик проверяет, что происходит на прод или запускает какую-либо аналитику для компании.
Ответить | Правка | ^ к родителю #49 | Наверх | Cообщить модератору

57. "Инцидент в сервисе непрерывной интеграции Travis CI"  +/
Сообщение от Аноним (??) on 11-Апр-18, 13:39 
Никогда не доверял этим конфигурациям через переменные окружения. Больные люди это придумали, банальный config.ini и то лучше.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема


  Закладки на сайте
  Проследить за страницей
Created 1996-2018 by Maxim Chirkov  
ДобавитьПоддержатьВебмастеруГИД  
Hosting by Ihor