Energy
education

сайт для тех, кто хочет изучать энергетику

C#

Информационная безопасность

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

7. Информационные политики безопасности

Домен – это основная административная единица в сетевой инфраструктуре предприятия, в которую входят все сетевые объекты, такие как пользователи, компьютеры, принтеры, общие ресурсы и т.д. Совокупность (иерархия) доменов называется лесом. У каждой компании может быть внешний и внутренний домен. DNS является базовым инфраструктурным сервисом, без которого невозможно себе представить работу любой корпоративной сети.

Внешний домен

Интернет — это бесчисленное количество физических устройств (серверов, компьютеров, планшетов и т.д.), связанных между собой в сеть. Любой сайт в Интернете по факту находится на физическом устройстве. Каждое устройство имеет свой уникальный номер — IP-адрес вида 123.123.123.123. Чтобы попасть на сайт, нужно знать IP-адрес устройства, на котором расположен этот сайт. А теперь представьте, сколько сайтов в день вы посещаете и сколько цифр вам пришлось бы запомнить. Конечно, это нереально. Поэтому для удобства работы в Интернете в 80-х годах была создана система доменных имен — DNS (Domain Name System). Смысл её в том, что каждому цифровому IP-адресу присваивается понятное буквенное имя (домен). Например, IP-адресу сервера 193.218.139.99 соответствует домен sfu-kras.ru. Когда вы вводите в браузере доменное имя, сервера DNS автоматически преобразуют его в IP-адрес. Домен за доли секунды переводится в IP DNS-системой и вы попадаете на нужный сайт.

Служба доменных имён работает благодаря DNS-cерверам. Именно эти жизненно важные «программы» хранят таблицы соответствий вида «имя домена» — «IP-адрес». Кроме того, DNS-серверы служат для хранения ресурсных записей доменов. В Интернете огромное количество DNS-серверов и каждый выполняет свою функцию в общей системе. Служба Domain Name System необходима для того, чтобы находить свои любимые сайты, не запоминая цифры.

Определение функции.
Схема работы DNS.

DNS переводит имя домена в IP-адрес:

  1. Когда вы вводите в строке браузера доменное имя, браузер ищет на вашем локальном компьютере файл hosts. В нём задаётся соответствие домена IP-адресу. Допустим, в этом файлe есть запись для введённого домена. Что это значит? Что сайт откроется сразу (стрелка 9). Если же записи нет, браузер сформирует DNS-запрос к интернет-провайдеру (стрелка 1), чтобы тот нашёл IP-адрес домена.
  2. У каждого интернет-провайдера есть локальные (кеширующие) DNS-серверы. После получения запроса провайдер ищет в своём кеше запись о соответствии требуемого домена IP-адресу. Если такая запись есть, браузер получит IP-адрес (стрелка 8). По этому адресу браузер обратится к хостингу, на котором расположен сайт, и пользователю откроется нужная страница (стрелка 9). Если запись отсутствует, провайдер перенаправит DNS-запрос на корневые DNS-серверы (стрелка 2).
  3. Корневые DNS-серверы хранят информацию только о DNS-серверах, ответственных за доменные зоны. Корневой DNS-сервер не может предоставить провайдеру информацию об IP-адресе домена. Зато он отправит IP-адрес DNS-сервера доменной зоны, в данном случае зоны .RU (стрелка 3).
  4. Теперь у интернет-провайдера есть IP-адрес DNS сервера доменной зоны .RU. Поэтому он обращается к этому DNS-серверу и запрашивает IP-адрес домена (стрелка 4).
  5. DNS-серверы зоны .RU хранят только информацию о DNS-серверах всех доменов в этой зоне, а не их IP-адреса. Поэтому DNS-серверы зоны подскажут Интернет-провайдеру IP-адрес DNS-сервера домена (стрелка 5).
  6. Интернет-провайдер получил IP-адрес DNS-сервера домена. Он обращается к DNS-серверу домена с запросом IP-адреса домена (стрелка 6).
  7. После получения запроса DNS-сервер сначала проверяет, есть ли у него информация о домене и искомый IP-адрес для него. В случае успеха DNS-сервер отправит IP-адрес домена интернет-провайдеру (стрелка 7).
  8. Интернет-провайдер получает IP-адрес домена и сохраняет его у себя в кеше. После этого он отправит браузеру результат DNS-запроса — IP-адрес домена (стрелка 8).
  9. Браузер обращается к хостингу по полученному IP-адресу (стрелка 9). Теперь пользователю открывается запрашиваемый сайт.

Основой DNS-системы являются корневые серверы. Их всего 13. Они принадлежат разным операторам и находятся в Северной Америке. Чтобы повысить устойчивость системы, были созданы копии основных серверов в разных странах. Таким образом, корневых серверов стало 123. Каждой копии присваивается тот же IP DNS-сервера, что и у главного устройства. DNS-серверы расположены согласно интенсивности использования интернет-инфраструктуры. Больше всего серверов всё равно находится в Северной Америке, но копии сервера есть и в России, Европе, Австралии, Китае, Бразилии, ОАЭ и других странах, включая Исландию. В России реплики корневых серверов DNS находятся в Москве, Санкт-Петербурге, Новосибирске, Ростове-на-Дону, Екатеринбурге.

Внутренний домен

Microsoft Active Directory стала стандартом систем единого каталога предприятия. Домен на базе Active Directory внедрён практически во всех компаниях мира, и на этом рынке у Microsoft практически не осталось конкурентов, доля того же Novell Directory Service (NDS) пренебрежимо мала, да и оставшиеся компании постепенно мигрируют на Active Directory. Active Directory (Служба каталогов) представляет собой распределённую базу данных, которая содержит все объекты домена. Доменная среда Active Directory является единой точкой аутентификации и авторизации пользователей и приложений в масштабах предприятия. Именно с организации домена и развёртывания Active Directory начинается построение ИТ-инфраструктуры предприятия. База данных Active Directory хранится на выделенных серверах – контроллерах домена.

Определение функции.
Служба каталогов Active Directory.

Развёртывание службы каталогов Active Directory даёт следующие преимущества:

  • Единая точка аутентификации. Сотрудникам требуется совместный доступ к документам или приложениям. При использовании домена Active Directory все учётные записи пользователей хранятся в одной базе данных, и все компьютеры обращаются к ней за авторизацией. Все пользователи домена включаются в соответствующие группы, например, «Бухгалтерия», «Кадры», «Финансовый отдел» и т.д. Достаточно один раз задать разрешения для тех или иных групп, и все пользователи получат соответствующий доступ к документам и приложениям. Если в компанию приходит новый сотрудник, для него создаётся учётная запись, которая включается в соответствующую группу. Если сотрудник увольняется, то достаточно заблокировать или удалить его учётную запись, и он сразу потеряет доступ ко всем компьютерам, документам и приложениям.
  • Единая точка управления политиками. В одноранговой сети все компьютеры равноправны. Ни один из компьютеров не может управлять другим, все компьютеры настроены по-разному, невозможно проконтролировать ни соблюдение единых политик, ни правил безопасности. При использовании единого каталога Active Directory, все пользователи и компьютеры иерархически распределяются по организационным подразделениям, к каждому из которых применяются единые групповые политики. Политики позволяют задать единые настройки и параметры безопасности для группы компьютеров и пользователей. При добавлении в домен нового компьютера или пользователя, он автоматически получает настройки, соответствующие принятым корпоративным стандартам. Также при помощи политик можно централизованно назначить пользователям сетевые принтеры, установить необходимые приложения, задать параметры безопасности Интернет-браузера, настроить приложения Microsoft Office и т.д.

Групповая политика - это способ настройки параметров компьютера и пользователя для устройств, которые присоединены к доменным службам Active Directory (AD), а также к учетным записям локальных пользователей. Она контролирует широкий спектр параметров и может использоваться для принудительного применения и изменения настроек по умолчанию для соответствующих пользователей. Локальная групповая политика - это базовая версия групповой политики для компьютеров, не входящих в домен. Параметры локальной групповой политики хранятся в следующих папках:

                C:\Windows\System32\GroupPolicy
                C:\Windows\System32\GroupPolicyUsers.
            

Когда в Windows вам необходимо открыть редактор локальной групповой политики, для этого вы можете использовать командную строку, команду выполнить (команда gpedit.msc), поиск на панели задач, меню Пуск или с помощью консоли управления (MMC).

Azure Active Directory

Azure Active Directory (Azure AD) - это корпоративное облачное решение Microsoft для управления идентификацией и доступом (IAM). Azure AD является основой системы Office 365 и может синхронизироваться с локальной службой Active Directory и обеспечивать аутентификацию для других облачных систем через OAuth.

Определение функции.
Azure Active Directory.

В 2020 Microsoft увидела резкое увеличение пользователей Azure. Хотя неясно, сколько из этих пользователей являются новичками в Azure AD, но мы можем предположить, что пандемия 2020 года дала толчок к внедрению Azure AD для удовлетворения потребностей удаленных пользователей при дистнционной работе. И Azure AD, и Windows AD созданы Microsoft, и обе являются системами IAM, но на этом сравнения в значительной степени заканчиваются. Это принципиально разные системы, существующие во взаимосвязанной корпоративной среде.

Azure Active Directory

  • REST API: Azure AD использует API передачи репрезентативного состояния (REST) ​​для поддержки связи с другими веб-службами.
  • Аутентификация: Azure AD использует облачные протоколы аутентификации, такие как OAuth2, SAML и WS-Security для аутентификации пользователей.
  • Сетевая организация: каждый экземпляр Azure AD называется «арендатором», который представляет собой плоскую структуру пользователей и групп.
  • Управление правами : администраторы объединяют пользователей в группы, а затем предоставляют группам доступ к приложениям и ресурсам.
  • Устройства: Azure AD обеспечивает управление мобильными устройствами с помощью Microsoft Intune.
  • Настольные компьютеры: рабочие столы Windows могут присоединяться к Azure AD с Microsoft Intune
  • Серверы: Azure AD использует доменные службы Azure AD для управления серверами, которые находятся в среде облачных виртуальных машин Azure.

Windows Active Directory

  • LDAP: Windows AD использует облегченный протокол доступа к каталогам (LDAP) для передачи данных между клиентами, серверами и контроллерами домена.
  • Аутентификация: Windows AD использует Kerberos и NTLM для проверки учетных данных пользователя.
  • Сетевая организация: Windows AD разделена на организационные единицы, домены и леса.
  • Управление правами : администраторы или владельцы данных назначают пользователей в группы, и эти группы имеют доступ к ресурсам в сети.
  • Устройства: Windows AD не управляет мобильными устройствами
  • Настольные компьютеры: рабочие столы, присоединенные к Windows AD, регулируются групповой политикой (GPO).
  • Серверы: серверы в Windows AD управляются объектами групповой политики или другой локальной системой управления сервером.
Определение функции.
Разница между Windows и Azure AD.

Azure AD Connect - это решение Microsoft для включения гибридных развертываний Windows AD и Azure AD. Azure AD Connect синхронизирует данные между локальными контроллерами домена и облаком. Azure AD Connect позволяет синхронизировать учетные записи пользователей из локальной системы с клиентом Azure. Он также обеспечивает синхронизацию хэшей паролей, сквозную аутентификацию, федерацию и мониторинг работоспособности. Эти функции позволяют пользователям иметь один и тот же идентификатор пользователя и пароль как локально, так и в облаке, что также упрощает управление гибридной средой.

Пользователи в Azure AD могут входить как внутри, так и вне Azure AD. Azure AD может содержать удостоверения для пользователей внутри вашей организации и пользователей за пределами вашей организации, у которых есть учетная запись Microsoft. Это означает, что вы можете вводить людей за пределами вашей организации в свой клиент и предоставлять им определенные разрешения, как если бы они были частью вашей организации. Если все сделано правильно, это обеспечивает дополнительный уровень безопасности данных организации.

Любое существенное преобразование в облачную инфраструктуру обязательно привлечет злоумышленников, которые хотят проникнуть на новые рубежи.

Определение функции.
Распространенные атаки на Azure AD.

Атаки грубой силой на Azure AD. Злоумышленники любят использовать обширные коллекции имен пользователей и паролей из дампов утечки данных, чтобы попытаться взломать учетные записи Azure AD - метод, известный как заполнение учетных данных. Azure AD доступен в Интернете, так что это относительно простая цель. Хорошая политика паролей и многофакторная аутентификация, а также поведенческий мониторинг активности входа в систему и геопереключения могут предотвратить большинство атак методом грубой силы.

Пример программы для подбора паролей грубой силой на языке C#

            
                    using System;
                    using System.Linq;

                    namespace ConsoleApp9
                    {
                        class Program
                        {
                            #region Private variables

                            // the secret password which we will try to find via brute force
                            private static string password = "Iw129";
                            private static string result;

                            private static bool isMatched = false;

                            /* The length of the charactersToTest Array is stored in a
                            * additional variable to increase performance  */
                            private static int charactersToTestLength = 0;
                            private static long computedKeys = 0;

                            /* An array containing the characters which will be used to create the brute force keys,
                            * if less characters are used (e.g. only lower case chars) the faster the password is matched  */
                            private static char[] charactersToTest =
                            {
                                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                                'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
                                'u', 'v', 'w', 'x', 'y', 'z','A','B','C','D','E',
                                'F','G','H','I','J','K','L','M','N','O','P','Q','R',
                                'S','T','U','V','W','X','Y','Z','1','2','3','4','5',
                                '6','7','8','9','0','!','$','#','@','-'
                            };

                            #endregion

                            static void Main(string[] args)
                            {
                                var timeStarted = DateTime.Now;
                                Console.WriteLine("Start BruteForce - {0}", timeStarted.ToString());

                                // The length of the array is stored permanently during runtime
                                charactersToTestLength = charactersToTest.Length;

                                // The length of the password is unknown, so we have to run trough the full search space
                                var estimatedPasswordLength = 0;

                                while (!isMatched)
                                {
                                    /* The estimated length of the password will be increased and every possible key for this
                                    * key length will be created and compared against the password */
                                    estimatedPasswordLength++;
                                    startBruteForce(estimatedPasswordLength);
                                }

                                Console.WriteLine("Password matched. - {0}", DateTime.Now.ToString());
                                Console.WriteLine("Time passed: {0}s", DateTime.Now.Subtract(timeStarted).TotalSeconds);
                                Console.WriteLine("Resolved password: {0}", result);
                                Console.WriteLine("Computed keys: {0}", computedKeys);

                                Console.ReadLine();
                            }

                            #region Private methods

                            /// <summary>
                            /// Starts the recursive method which will create the keys via brute force
                            ///</summary>
                            /// <param name="keyLength">The length of the key</param>
                            private static void startBruteForce(int keyLength)
                            {
                                var keyChars = createCharArray(keyLength, charactersToTest[0]);
                                // The index of the last character will be stored for slight perfomance improvement
                                var indexOfLastChar = keyLength - 1;
                                createNewKey(0, keyChars, keyLength, indexOfLastChar);
                            }

                            /// <summary>
                            /// Creates a new char array of a specific length filled with the defaultChar
                            ///</summary>
                            /// <param name="length">The length of the array</param>
                            /// <param name="defaultChar">The char with whom the array will be filled</param>
                            /// <returns></returns>
                            private static char[] createCharArray(int length, char defaultChar)
                            {
                                return (from c in new char[length] select defaultChar).ToArray();
                            }

                            /// <summary>
                            /// This is the main workhorse, it creates new keys and compares them to the password until the password
                            /// is matched or all keys of the current key length have been checked
                            ///</summary>
                            /// <param name="currentCharPosition">The position of the char which is replaced by new characters currently</param>
                            /// <param name="keyChars">The current key represented as char array</param>
                            /// <param name="keyLength">The length of the key</param>
                            /// <param name="indexOfLastChar">The index of the last character of the key</param>
                            private static void createNewKey(int currentCharPosition, char[] keyChars, int keyLength, int indexOfLastChar)
                            {
                                var nextCharPosition = currentCharPosition + 1;
                                // We are looping trough the full length of our charactersToTest array
                                for (int i = 0; i < charactersToTestLength; i++)
                                {
                                    /* The character at the currentCharPosition will be replaced by a
                                    * new character from the charactersToTest array => a new key combination will be created */
                                    keyChars[currentCharPosition] = charactersToTest[i];

                                    // The method calls itself recursively until all positions of the key char array have been replaced
                                    if (currentCharPosition < indexOfLastChar)
                                    {
                                        createNewKey(nextCharPosition, keyChars, keyLength, indexOfLastChar);
                                    }
                                    else
                                    {
                                        // A new key has been created, remove this counter to improve performance
                                        computedKeys++;

                                        /* The char array will be converted to a string and compared to the password. If the password
                                        * is matched the loop breaks and the password is stored as result. */
                                        if ((new String(keyChars)) == password)
                                        {
                                            if (!isMatched)
                                            {
                                                isMatched = true;
                                                result = new String(keyChars);
                                            }
                                        return;
                                        }
                                    }
                                }
                            }
                            #endregion
                        }
                    }
                
            

Список популярныз паролей можно найти здесь

Простейший пример отправки POST запроса на языке C#

                
                    using System;
                    using System.Net.Http;
                    using System.Threading.Tasks;

                    namespace ConsoleApp
                    {
                        class Program
                        {
                            public static async Task
                            Post()
                            {
                                HttpClient Client = new HttpClient();
                                StringContent Content = new StringContent("login=123&password=123");
                                return await Client.PostAsync("https://users.sfu-kras.ru/php/auth.php", Content);
                            }
                            static void Main(string[] args)
                            {
                                var answer = Post().Result;
                                Console.WriteLine(answer.ToString());
                                Console.WriteLine(answer.Content.ReadAsStringAsync().Result);
                            }
                        }
                    }
                
            

Фишинг - еще одна популярная атака, против пользователей Azure AD. Фишинг может привести к краже учетных данных или заражению вредоносным ПО, что может дать злоумышленникам точку опоры для доступа к клиенту. Одно из лучших улучшений, предоставляемых Azure AD, - это предупреждения, когда вы открываете электронное письмо от постороннего или ненадежного источника.

Последняя атака связана с Azure AD Connect, который является способом синхронизации Azure и локальной AD. Azure AD Connect можно настроить с помощью метода сквозной проверки подлинности. При использовании этого метода локально устанавливается сервер, называемый «агентом Azure». Если злоумышленник скомпрометирует сервер агента Azure организации, он может создать бэкдор, который позволит ему войти в систему как любой синхронизированный пользователь. Вы можете прочитать подробности про атаки Azure Skeleton Key здесь.