На варті інфобезпеки: як ми створили систему, яка видаляє сторонні Telegram-акаунти

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Усім привіт! Я — В’ячеслав Феньо, Back-end developer в NIX.

Сьогодні війна триває на землі, в повітрі й в інформаційному просторі. Реалії підштовхують IT-фахівців шукати нові способи захисту конфіденційної інформації. У цій статті я хочу поділитися з вами досвідом та викликами, завдяки яким наша команда підготувалась до таких подій. Сподіваюсь, матеріал буде корисний тим, хто хоче створити щось подібне для своєї компанії або для особистих цілей.

Для нас завжди важливим завданням було і залишається піклування про конфіденційність даних усіх членів команди. Тому ще до війни задля безпеки спілкування у внутрішніх чатах ми в NIX запустили спеціальну систему на базі Telegram. Watchman або, як ми його називаємо між собою — «Вартовий» — дозволяє автоматично видаляти сторонні акаунти з приватних чатів. Ця система стала надзвичайно актуальною у період зростання в мережі інформаційних атак.

Чому Telegram

Розробка мала бути інтегрована у найзручніший та найпопулярніший месенджер для нашої команди. Ним виявився Telegram. По-перше, ним користується кожен наш фахівець. По-друге, реалізувати безпечну комунікацію варто було швидко і просто з точки зору як розробки, так і подальшого користування. І знову бінго — той самий Telegram нам підходить.

Зазирнувши «під капот» Telegram, ми побачили дуже приємну, як для користувачів, річ. Його функціонал має багато лімітів та обмежень, а деякі «брудні» моменти в ньому взагалі немає можливості зробити. Тож маємо справу з дійсно безпечним месенджером, а це — наш пріоритет.

Однак не можу не згадати той факт, що за замовчуванням у Telegram-чатах немає наскрізного шифрування. Для декого це ставить під сумнів його безпеку в цілому. Чесно кажучи, наявні способи, якими можна «зламати» Telegram можливі лише шляхом перехоплення доступу до облікового запису. Уникнути такої ситуації достатньо просто: треба встановити двофакторну аутентифікацію.

Сервіс, який завжди на часі

У мирний час наша команда у повному складі зосереджена в Харкові. Через повномасштабне вторгнення росії на територію України, у тому числі в наше місто, нам довелося залишити свої домівки та виїхати у більш безпечні місця. Для віддаленої координації спільноти у понад 3000 IT-спеціалістів наш волонтерський штаб створив десятки Telegram-чатів. У кожному з них зараз сотні користувачів. Люди обговорюють свої переміщення, місцеперебування та іншу конфіденційну інформацію, яку, звичайно ж, не хотілося б розповсюджувати.

Як же під час постійних кібератак гарантувати, що всі учасники наших закритих чатів — це члени Ніксової команди? Так виникла ідея створити сервіс, який перевірятиме відповідність Telegram-акаунтів усіх членів чату з їх обліковими записами у нашому домені. Ми поставили собі ціль розробити автоматизовану систему менеджменту чатів, яка видалятиме сторонніх осіб із приватних чатів (командних, профільних або спеціально організованих). І одразу почали втілювати задум у розробці.

Процес розробки та перші здобутки

Перед нами стояла дуже важлива ціль — збереження даних. Це мало було проявитися у всіх аспектах нашої системи. Звичайно, що завдання «розробити систему для видалення сторонніх осіб з приватних чатів» звучить дещо абстрактно, тому без декомпозиції тут ніяк. Врешті, ми поставили основні задачі та вимоги, яким відповідатиме наша система:

  • Аутентифікація поточних учасників команди за допомогою OpenID
  • Моніторинг чатів та фільтрація тих учасників, які не мають активного облікового запису в NIX домені
  • Обробка запитів видалення від внутрішнього сервісу управління користувачами
  • Надійна й автоматизована робота системи
  • Максимальна простота
  • Мінімальна кількість збережених даних
  • Швидкі розгортання та підтримка

Ідентифікувати користувачів та надавати їм доступ ми можемо за допомогою технології єдиного входу (Single Sign On). Для швидкої ідентифікації ми вирішили не вигадувати велосипед, а застосувати усім нам добре відомий протокол Oauth 2. Думаю, що не треба детально описувати переваги такого підходу. Звісно, що це не панацея. Краще, аби ви мали декілька рівнів перевірки користувача, що у результаті нам і довелося зробити. Просто, швидко, надійно. Як тепер це все інтегрувати в Telegram?

Здавалося б, загалом нескладно. Однак нас чекали декілька сюрпризів. Були спроби використати Telegram Bot API, але на жаль його можливостей не вистачало для наших потреб в силу його обмежень. Тож нам довелося використати Telegram API, що працює за допомогою протоколу MTProto.

З клієнтським API все було дещо інакше, краще, швидше. Але й тут ми стикалися з лімітами та обмеженим функціоналом (на те він і клієнт). До того ж у нас не було досвіду інтеграції саме клієнта і доводилося пізнавати Telegram «зсередини» у процесі. Інколи ми були приємно шоковані — іноді ні. Дуже глибокий внутрішній світ. Все ж, раджу одразу аналізувати доступний функціонал та ліміти, і завжди перевіряти офіційну документацію. Все дуже швидко змінюється. Ми неодноразово стикалися з цим.

Не останньою задачею було зробити процес розробки й повноцінного запуску надзвичайно простим. В нас є декілька скриптів, котрі відповідають за певний функціонал: Telegram бот, моніторинг та обробка запитів від системи менеджменту. Варто було налаштувати повну автоматизацію системи та налагодити її стабільну роботу без участі розробників чи адміністраторів. На мою думку, найпростіші та ефективні інструменти для такої задачі це Docker та Supervisor. Тривала і справна робота системи показує що цього виявилося більш ніж достатньо.

Щоб завжди бути в курсі, що коїться на сервері, ми використали систему нотифікацій Supervisor. У поєднанні зі Slack нам вдалося забезпечити необхідне управління та моніторинг системи. Такий собі лоукост-варіант для налаштування сповіщень, що відпрацьовує на всі 100%.

Як розробнику, мені дуже кортіло зробити цю систему надто простою аби в ній не могли зʼявлятися складні речі. До речі, мовою розробки був обраний Python, тобто в нас були всі шанси. Розподіл системи на функціональні частини та абстракції, повторне використання, мінімальна кількість даних (лише два поля!) й чітка логіка майже виключають можливість помилки, та водночас надають змогу швидко її локалізувати, що не може не тішити. Це неабияк допомогло нам при додаванні нового функціоналу.

Одразу хочеться додати маленьку ремарку. Дана система побудована на досить базовому Python стеку для веб-додатків та бібліотек для роботи з Telegram, починаючи від того ж Docker і закінчуючи механізмом обробки розподілених завдань. Аби уникнути холівару щодо найкращої мови програмування для таких цілей: it’s up to you. Кожен знайде для себе свій ідеальний набір.

Надважливими частинами були та залишаються активний моніторинг чатів та механізм активації/деактивації облікового запису у системі. Ним було відведено найбільше часу, адже помилка у таких процесах не має права на існування, особливо в продакшені. Хоч ми й дуже ретельно все перевірили, все ж перший реліз видався для нас дуже нервовим. Це були наші перші справжні канали з сотнями користувачів. Відповідальність в таких умовах різко зростає.

Як у результаті працює «Вартовий»

Багато компонентів, скриптів, інтеграцій, коду, налаштувань — і врешті ми маємо корисний, зручний і безпечний сервіс:

  • Під час запуску бота сервер запам’ятовує дані користувача Telegram. Далі бот надсилає посилання на аутентифікацію у системі Single Sign On.
  • Одразу після успішної аутентифікації перевіряється статус облікового запису в системі Watchman.
  • Якщо користувач із неактивним обліковим записом спробує здійснити аутентифікацію, то вона буде відхилена.
  • Сервер отримує дані про користувача від SSO та повʼязує з відповідним Telegram акаунтом.
  • Бот надсилає відповідне повідомлення та посилання на приватні Telegram-канали (інвайти). Користувач також має змогу отримати перелік чатів з посиланнями, з яких його було видалено, якщо такі є.

Окремо від основного процесу здійснюється періодичний моніторинг чатів для видалення користувачів з неактивним обліковим записом. Тобто ми завжди знаємо актуальну кількість учасників. До того ж це дозволяє уникнути monkey work для адмінів — їм не потрібно весь час самостійно слідкувати за великими чатами.

Для того, щоб підтримувати систему в актуальному стані, ми додали можливість отримувати відповідні сигнали активації/деактивації облікових записів у SSO.

На сьогодні усі ці механізми дозволяють нам автоматизувати процеси ідентифікації, моніторингу та актуалізації у Telegram. Усе, як і планували.

Баги, бани та літри випитої кави. Як ми це все тестували

Процес тестування зайняв багато часу та сил через специфіку системи та особливості її використання. Необхідно було перевірити близько сотні сценаріїв поведінки. Наприклад, аутентифікацію користувача після його блокування та після повторної активації облікового запису. Цей процес здавався нескінченним і повинен був завершитися «ще вчора», як то кажуть.

Отже, маємо механізм активації/деактивації користувача в системі за певним сигналом. Він собі просто попрацював, щось там змінив у базі, сходив до Telegram, щось написав користувачу... Робота над його варіативністю забирала багато часу на тестування і врешті породжувала багато неефективного коду. Як розробник, я не міг це просто так залишити. Цей механізм вдалося спростити, усунувши зайві сторонні виклики та розділивши відповідальність між окремими частинами системи. У результаті система стала більш стабільною і швидкою для користувачів. А процес тестування — набагато ефективнішим.

Чимало казусів траплялося і з різними клієнтами Telegram на різних пристроях. Десь вони працювали по-різному, десь — щось взагалі не показувало, десь — нас забанили. Деякі баги — це взагалі окрема сесія для брейншторму. Гадаю, наші тестувальники запамʼятають їх надовго. Ось вам маленька порада щодо тестування подібного продукту: немає сенсу робити це на різних платформах. Взагалі. Насамперед не тестувати з веб-версією. Забудьте про неї. Економте свій час.

Як до, так і після релізу ми поступово додавали новий функціонал або варіації поведінки системи. Ми завжди мали великі амбіції та чіткі цілі по вдосконаленню цієї розробки. І в доволі короткий строк спільними зусиллями нам вдалося реалізувати та причепурити бажаний функціонал. Звісно, вдосконалювати IT-продукт можна весь час, поки він існує. У нашому випадку принцип «розділяй та володарюй» спрацював якнайкраще. Функціональні частини розробки стали незалежними одна від одної. Тому ми завжди знаємо, де виникла проблема, як її відтворити та швидко виправити.

Тож, на сьогодні завдяки Watchman ми маємо:

  • 136 активних контрольованих чатів
  • 253 видалених сторонніх акаунтів
  • Понад 2000 аутентифікованих користувачів.

Яких фахівців варто залучити до такої розробки

Для того, щоб зробити щось подібне для своєї компанії, раджу приділити особливу увагу формуванню команди. Безумовно, у вас має бути спеціаліст, який добре знається на тому, як працювати з Telegram-чатами. Це дуже економить час. Якщо немає такого фахівця, детально проаналізуйте, що то таке й як воно працює. Не все так просто, як може здатися з першого погляду.

У цій розробці більша частина роботи покладена на backend. Від початку до кінця ним займався я один. Скажу відверто, це не найкраща ідея. Бо роботи багато, і вона дуже різноманітна: інтеграції, моніторинг, бот, клієнт та інші фічі. Залучити кількох Backend-розробників буде оптимальним рішенням.

Під час створення Watchman ми стикалися з великою кількістю несподіванок, які потрібно було вирішувати якомога простіше і водночас неординарно. В цьому неабияк допомогла підтримка інших технічних фахівців з NIX. Ми працювали у кращих Ніксових традиціях — весело й гуртом. Наші спеціалісти консультували з приводу інтеграцій з іншими системами та їхніми можливостями. Про наших девопсів і взагалі нема чого казати — усе, за що вони беруться, чудово працює. Так, спільними зусиллями нам вдалося зробити швидкий, оптимізований і безпечний продукт.

Сподобалась стаття? Натискай «Подобається» внизу. Це допоможе автору виграти подарунок у програмі #ПишуНаDOU

👍ПодобаєтьсяСподобалось5
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Оце сподобалося.

Зазирнувши «під капот» Telegram, ми побачили дуже приємну, як для користувачів, річ. Його функціонал має багато лімітів та обмежень, а деякі «брудні» моменти в ньому взагалі немає можливості зробити. Тож маємо справу з дійсно безпечним месенджером, а це — наш пріоритет

Особливо безпечні меседжі на сервері в плейнтексті за замовчуванням, за виключенням секретних чатів, які незручні і ніхто їх не користує. І ті використовують наколінний протокол, і я б не те що проти іновацій, але don’t roll your own crypto.
crypto.stackexchange.com/...​-of-protocols/37242#37242

Телеграм зумів продати безпечність на рівні однокласників під банером лютої прайвасі, а по факту це просто один великий каталог для грепу. А брудних моментів *з якими* треба щось зробити — там достатньо.

За посиланням відповідь, в якій розглядається протокол телеграму 2016 року. Там були зміни відтоді

В іншому топіку обговорювали, там уже мільйон «пруфів», що Телеграм небезпечний зібрали

З огляду на те, з якою претензією я читаю ваш пост, я подумаю, щоб додати його до усієї іншої «доказової бази»

Як з абсолютно нового девайсу можна зайти в телеграм і отримати всю історію? Просто якщо для вас зберігання ваших даних в плейнтексті до першого витоку — це безпечно, то це питання до ваших стандартів безпеки. Маючи реальні альтернативи, які дійсно дають тобі контроль над своїми даними (бо сучасна криптографія дозволяє в zero trust) так топити за зручний вконтактік? Тщ майор одобряєт.

Раз мільйон пруфів зібрали, то й на таке просте питання буде відповідь.

Ще раз спробую, але без сарказму дуже складно відповідати на такі повідомлення

Ви подаєте «зберігання в плейнтексті» як непорушну істину, яка служить аргументом на вашу користь

«Маючи альтернативи» теж подається як беззаперечна правда, теж чомусь підтверджує вашу позицію

«Питання до ваших стандартів безпеки» — щось, що теж безапеляційно дискредетує мене як вашого співрозмовника

Ці тези сильно далекі від мови фактів

Тепер можете для читача форуму якось пояснити «що не так з Телеграмом» насправді, бо мої «стандарти безпеки», які «під питанням», мало кому розказують чому Телеграм треба викинути вже сьогодні

Було б круто, якби ви показали як саме можна викрасти чиїсь «плейн текст» дані, продемонстрували справжні ризики і пояснили чому усунити їх можна тільки переходом на щось інше

Практика мені показує, що зараз ви просто скажете «гугли сам», «все уже довели», або максимум скинете якусь рекламну статтю про Signal, в якій критикують Telegram або подібне лайно з нульовим відсотків пруфів і фактів на користь однієї або іншої сторони

Я буду сильно здивований, якщо ви, насправді, розробник популярного клієнту для Телеграму, стикнулися з якоюсь проблемою у протоколі і можете висвітлити щось дуже конкретне

>розробник популярного клієнту для Телеграму, стикнулися з якоюсь проблемою у протоколі

З чим саме я повинен стикнутися в *клієнтському* апі? В голос.

як саме можна викрасти чиїсь «плейн текст» дані,

Ясно. Тобто безпечність data at rest вже не рішає, бо нінужна. На цьому, думаю, можна закінчити, бо це як зі свідками Дії, з пустого в порожнє.

Я згадав розробників застосунків як мірило обізнаності про телеграм, тому що на моє переконання, ті, хто пишуть ботів, застосунки і ще якось взаємодіють з телеграмом мають краще розуміння про те, як він працює

Якщо ви не вірите, що можете стикнутися з багом в «клієнтському апі», то як ви збиралися «плейн текст» дані витягувати?

Інакше кажучи, щоб взломати чийсь акаунт треба влаштовуватися на роботу в телеграм і отримувати доступ до бази даних, щоб знайти там «плейн текст» дані?

Ви як експерт можете звичайному читачу просто пояснити як саме це зробити, чому це можливо і наочно показати які саме ризики є?

Не треба ні на що інше відповідати, один раз розкрийте ось це питання і все

Те саме можете і про «Дію» розказати, бо виходить, що ви теж свого роду свідок

Підписатись на коментарі