В каком случае производится наследование файловых прав доступа

Обновлено: 16.06.2024

Реализация контроля и разграничения прав доступа по созданию файловых объектов и к системным файловым объектам

УДК 004.056.53

Введение

В работах [1,2] авторами были предложены принципы и методы контроля доступа к создаваемым файловым объектам, основанные на их автоматической разметке и их практическая реализация. Эти методы позволяют реализовать разграничительную политику доступа к данным, обрабатываемым в информационной системе (к создаваемым в процессе работы пользователей файлам). Принципиальным достоинством подобных методов контроля доступа, кардинально меняющим собственно технологию защиты обрабатываемых в информационной системе данных от несанкционированного к ним доступа, является простота администрирования реализующих их средств защиты и корректность реализации разграничительной политики доступа в общем случае [3,4] (реализация данных подходов рассмотрена, например, в статье, размещенной на этом сайте по ссылке).

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

В данной работе рассмотрим реализацию контроля и разграничения прав доступа к файловым объектам, решающего данные задачи защиты информации, а также средство защиты, реализующее запатентованные авторами технические решения [5,6], использованные и апробированные при разработке комплексной системы защиты информации «Панцирь +" для ОС Microsoft Windows.

1. Требования и подходы к реализации контроля и разграничения прав доступа по созданию файловых объектов и к системным объектам.

Принципиальным при формировании требований к реализации контроля доступа к защищаемым ресурсам, в том числе, к файловым объектам, является ответ на следующий вопрос: каким образом и в каком виде хранятся правила доступа субъектов к объектам (или к объектам субъектов)? Именно способ хранения правил доступа во многом влияет на функциональные возможности контроля доступа, поскольку им определяется то, каким образом идентифицируется в разграничительной политике объект доступа.

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

Проиллюстрируем сказанное на примере реализации контроля и разграничения прав доступа по созданию файлов. Появляется возможность разграничивать не только то, в каких объектах можно/нельзя субъекту создавать файловые объекты, в первую очередь, файлы, но и то, какие типы файлов ему разрешено/запрещено создавать. В частности, эту возможность можно использовать для защиты от несанкционированной загрузки на компьютер программ, в том числе, вредоносных, и модификации санкционированно установленных программ (для этого достаточно запретить создавать файлы с расширениями исполняемых объектов). Аналогичным образом при помощи масок могут назначаться объекты файловой системы с расширениями *.js, *.vbs, *.php и др., которые являются скриптовыми файлами. Предотвращение возможности создания на компьютере подобных файлов, загружаемых с веб-сайтов (большинство из этих скриптов предназначено для автозаполнения форм, рекламного баннера, загрузки дополнительной страницы с рекламой и т.д.) не только позволяет защитить соответствующее приложение от наделения его вредоносными свойствами [9], но и позволяет защитить пользователя от получения им ненужной рекламы и ссылок при работе в сети интернет.

Также к важным вопросам, формирующим требования к реализации контроля доступа, следует отнести способ задания (используемый набор сущностей) в разграничительной политике субъекта доступа и способ назначения правил доступа – назначаются ли правила доступа субъекта к объектам, либо, наоборот, к объекту субъектов.

При контроле и разграничении прав доступа к защищаемым ресурсам с использованием двух сущностей, идентифицирующих пользователя – исходный и эффективный, при запуске процесса запоминается, каким пользователем он запущен (первичный идентификатор), а при запросе этим процессом доступа к ресурсу определяется, от лица какого пользователя запрашивается доступ (эффективный идентификатор). Разграничительной политикой устанавливаются разрешения/запреты смены идентификатора при доступе к защищаемым ресурсам. Аутентификация в данном случае состоит в проверке подлинности идентификации – корректности смены (если она разрешена) первичного идентификатора при запросах доступа к ресурсам.

Замечание. Естественно, что разграничительная политика доступа должна задаваться в отношении, как интерактивных, так и системных пользователей, как прикладных, так и системных процессов.

Хранение правил доступа в виде отдельного объекта (без привязки в качестве атрибутов доступа к файловым объектам) позволяет принципиально изменить способ назначения прав доступа и отображения заданной разграничительной политики доступа, реализовав назначение прав доступа не к объектам субъектов, а субъектов к объектам. Это крайне принципиальный момент. Реализация данного подхода не только кардинально упрощает реализацию настройки разграничительной политики доступа, но и позволяет наглядно в одном окне интерфейса средства защиты отображать заданные права доступа для выбранного субъекта ко всем объектам, а не к конкретному объекту субъектов, что требуется при реализации разграничений прав доступа между субъектами. Чтобы получить аналогичную информацию о реализованной разграничительной политике доступа к объектам в отношении какого-либо субъекта при альтернативном способе задания прав доступа, потребуется просмотреть атрибуты доступа всех файловых объектов в системе.

Теперь рассмотрим, пожалуй, один из ключевых моментов использования масок при задании субъектов и объектов доступа в разграничительной политике, какие при этом могут возникать противоречия, и как они могут устраняться.

В общем случае под одну и ту же маску будет подпадать (покрываться маской) несколько реальных субъектов, соответственно объектов доступа, с этой целью маски и используются. Но при этом один и тот же реальный субъект, соответственно объект доступа может подпадать одновременно под несколько масок.

В [5,6] предложено техническое решение (с различными способами идентификации субъекта доступа), реализующее автоматическое ранжирование системой между собою масок задаваемых в разграничительной политике субъектов (объектов) доступа по точности описания реального субъекта (объекта), с возможностью ручного изменения автоматически заданных рангов вручную администратором.

2. Средство контроля и разграничения прав доступа.

Создание субъектов доступа.

Субъекты доступа, которые, как ранее говорили, идентифицируются в разграничительной политике доступа тремя сущностями, создаются из меню, приведенного на рис.1.

Рис.1. Меню создания субъекта доступа в разграничительной политике

Созданные субъекты автоматически ранжируются (по заданным правилам) по точности описателя и отображаются в интерфейсе в соответствующем порядке (либо сверху вниз, либо снизу вверх), см. рис.2.

Рис.2. Интерфейс отображения созданных субъектов доступа в разграничительной политике

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

Субъекты, которые будут обладать одинаковыми правами доступа к объектам, помещаются в один и тот же профиль (для помещения субъекта в профиль, имена соответствующего субъекта и профиля задаются при создании субъекта в окне задания субъекта доступа, см. рис.1). Интерфейс отображения созданных профилей, в котором отображаются созданные администратором профили и включенные в профили субъекты (описываемые своими именами), приведен на рис.4. Для упрощения администрирования реализована возможность создания нового профиля на основе существующего, по средством необходимой модификации существующего профиля.

Рис.4. Интерфейс отображения профилей в разграничительной политике

Создание объектов доступа.

Файловые объекты доступа создаются из меню, приведенного на рис.4 и отображаются в интерфейсе, представленном на рис.5.

Рис.5. Меню создания объекта доступа в разграничительной политике

Рис.6. Интерфейс отображения созданных объектов доступа в разграничительной политике

Как отмечали ранее, при задании объектов доступа могут использоваться маски и переменные среды окружения. С учетом возможности использования масок, одновременно несколько заведенных объектов, могут соответствовать реальному объекту, определяемому его полнопутевым именем, к которому запрашивается доступ. Для выбора правила доступа реализован следующий приоритет точности описания объектов в разграничительной политике, исходя из их типа: файл, маска файла, каталог, маска каталога, маска. Заданные в разграничительной политике объекты сравниваются с реальным объектом и запроса доступа, с целью определения наиболее точного описателя, в заданном порядке обработки - файл, если не подходит, то маска файла, соответственно, каталог, маска каталога, маска.

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

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

Рис.7. Задание объекта доступа устройство в разграничительной политике

Создание правил доступа и правил аудита доступа.

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

Рис.8. Меню задания правил доступа в разграничительной политике

Рис.9. Интерфейс отображения созданных правил доступа и аудита доступа для выбранного субъекта в разграничительной политике

В качестве же объектов доступа в создаваемых разграничительных политиках, в том числе по созданию новых файловых объектов, могут использоваться файловые объекты, в том числе на внешних накопителях, присутствующие на момент задания правил доступа администратором (классифицируемые нами в [1], как статичные), в том числе системные файловые объекты.

Как видим, рассмотренные решения имеют, что имеют общего, с используемыми сегодня на практике реализациями методов контроля и разграничения прав доступа к файловым объектам, и могут эффективно применяться при реализации сложных разграничительных политик доступа.

Рис.10. Задание объекта доступа объект реестра ОС в разграничительной политике

Рис.11. Интерфейс отображения созданных объектов доступа – объектов реестра ОС в разграничительной политике

Рис.12. Меню задания правил доступа к объектам реестра ОС в разграничительной политике

Литература

К.А. Щеглов, А.Ю. Щеглов. Принцип и методы контроля доступа к создаваемым файловым объектам // Вестник компьютерных и информационных технологий. - 2012. - № 7. - С. 43-47.

Щеглов А.Ю., Щеглов К.А. Система контроля доступа к файлам на основе их автоматической разметки. Патент на изобретение № 2524566. Приоритет изобретения 18.03.2013.

Щеглов К.А., Щеглов А.Ю. Практическая реализация дискреционного метода контроля доступа к создаваемым файловым объектам//Вестник компьютерных и информационных технологий. - 2013. - № 4. - С. 43-49.

Щеглов К.А., Щеглов А.Ю. Реализация метода мандатного доступа к создаваемым файловым объектам // Вопросы защиты информации. - 2013. - Вып. 103. - № 4. - С. 16-20.

Гостехкомиссия России. Руководящий документ. Средства вычислительной техники. Защита от несанкционированного доступа к информации. Показатели защищенности от НСД к информации. - Москва, 1992.

Маркина Т.А., Щеглов А.Ю. Метод защиты от атак типа drive-by загрузка. - Известия ВУЗзов. Приборостроение, 2014. - № 4. - С. 15-20.

Щеглов К.А., Щеглов А.Ю. Методы идентификации и аутентификации пользователя при доступе к файловым объектам // Вестник компьютерных и информационных технологий. - 2012. - № 10. - С. 47-51.

Щеглов К.А., Щеглов А.Ю. Защита от атак со стороны приложений, наделяемых вредоносными функциями. Модели контроля доступа // Вопросы защиты информации. - 2012. - Вып. 99. - № 4. - С. 31-36.

Щеглов К.А., Щеглов А.Ю. Защита от атак на уязвимости приложений. Модели контроля доступа // Вопросы защиты информации. - 2013. - Вып. 101. - № 2. - С. 36-43.

Для продолжения исследования системы прав доступа файло­вой системы NTFS в окне вкладки Безопасность (рис.1.10) следует нажать кнопку Дополнительно (рис.1.11.). В появившемся окне отображен список объектов – пользователей и групп, кото­рые имеют различные права к данному объекту файловой системы. Данное окно повторяет окно свойств систем безопасности файловой системы, изображенной на рис.1.10, с двумя исключениями.

Во-первых, появился новый пункт списка Унаследовано от, что означает, есть ли у прав пользователей или их групп, приведенных в списке, наследование от предыдущих объектов файловой системы и если да, то откуда. При использовании механизма наследования все каталоги и файлы, создаваемые внутри другого внешнего каталога, от которого ведется наследование, будут создаваться с аналогичными правами. Если папка C:\WINDOWS (рис.1.10) имеет опреде­ленный набор свойств безопасности файловой системы (прав доступа), то и папка C:\WINDOWS\inf будет иметь те же права, которые унаследованы от папки C:\WINDOWS (рис.1.12.).


Рисунок 1.11. Расширенные настройки системы безопасности

файловой системы для папки C:\WINDOWS


Рисунок 1.12. Окно расширенных свойств безопасности

для папки C:\WINDOWS\inf

Наследование файловых прав доступа происходит, так как стоит флажок в режиме Наследовать от родительского объекта применимые к дочерним разрешения, добавляя их к явно заданным в этом окне (рис.1.12.). Строка C:\WINDOWS\ в столбце Унаследовано представляет собой путь объекта, от которого происходит наследование. Далеко не все объекты файловой системы из папки C:\WINDOWS наследуют ее свойства, на­пример, свойства папки C:\WINDOWS\java (рис.1.13.).


Рисунок 1.13. Окно расширенных свойств безопасности

для папки C:\WINDOWS\java

Данная папка не использует механизма на­следования файловой системы, так как в списке объектов, использующих права доступа, указано , а также по тому, что не стоит флажок в режиме Наследовать от родительского объекта применимые к дочерним объектам разрешения, добавляя их к явно заданным в этом окне.

1.8. Особые разрешения

Во вкладке Разрешения кнопки Добавить и Удалить (рис.1.13.) ответственны, соответственно, за добавление и удаление пользовательских прав как от­дельных пользователей, так и их групп. Кнопка Изменить позволяет прово­дить более точную раздачу пользователям и их группам прав файловой сис­темы. Это важно для профессиональных системных администраторов и экспертов по компьютерной безопасности.

Для просмотра полного набора прав, которыми обладает файловый объект следует выбрать пользователя или группу пользователей и нажать кнопку Изменить (рис.1.14). Появится новое окно Объект с расширенными правами:



Рисунок 1.14. Расширенные права доступа для папки C:\WINDOWS\java

режим Полный доступ означает, что выбранный пользователь или группа будут иметь все права над данным файловым объектом;

режим Обзор папок / Выполнение файлов означает, что данному пользователю или группе разрешено перемещаться по каталогу, если это каталог, и выполнять данный файл, если это файл;

режим Содержание папки / Чтение данных означает возможность для пользователя группы производить просмотр каталога, если данный объект каталог и читать данные, если это файл;

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

режимы Дальнейшие права файловой системы, Создание файлов / Запись данных и Создание папок / Дозапись данных управляют возможностью пользователя или группы создавать файлы и записывать в них информацию, создавать папки и дозаписывать информацию в файлы, соответственно;

режимы Запись атрибутов и Запись дополнительных атрибутов означают, соответ­ственно, возможность записи или изменения пользователями или группами пользователей атрибутов или расширенных атрибутов файловой системы;

режим Удаление подпапок и файлов означает возможность пользователя или группы удалять файлы и папки, даже если право Удаление не указано для этого файла или папки;

режим Удаление позволяет разрешить пользователю или группе удалить данный файл или папку, если в данном праве не стоит флажок, то можно удалить файл, если предоставлено право Удаление подпапок и файлов;

режим Чтение разрешений дает возмож­ность чтения пользователем или группой пользователей прав данного файла или папки, таких как Полный доступ, Чтение и Запись;

режим Смена разре­шений позволяет изменять пользователю или пользо­вательской группе права доступа у данного файла или папки, такие как Полный доступ, Чтение и Запись;

режим Смена владельца позволяет данному пользователю или группе стать владельцем данного фай­лового объекта, в качестве владельца данный пользователь или группа полу­чит возможность всегда изменять права доступа, вне зависимости от того, какие разрешения указанны для этого файлового объекта.

Для установки или удаления любого из перечисленных пользова­тельских прав доступа файловой системы необходимо поставить флажок рядом с ним в столбце Разрешить или Запретить, соответственно, для раз­решения или запрещения данного права пользователю или группе и нажать кнопку ОК.

Последней опцией данного окна является флажок внизу окна Применять эти разрешения к объектам и контейнерам только внутри этого контейнера. Если данный флажок установлен, происходит применение выбранных прав доступа только к выбранному объекту. В противном случае, изменения будут распространяться на все дерево объектов, ниже текущего уровня.

Наиболее распространённый способ доступа пользователей к данным — доступ к общим файловым ресурсам в сети. Управление доступом к файлам и папкам осуществляется с помощью прав доступа к общему файловому ресурсу и доступа к NTFS. Для обеспечения безопасности ваших файлов важно понимать, как действуют права доступа.

Права доступа к файловой системе NTFS позволяют определять уровень доступа пользователей к размещённым в сети, или локально на вашем компьютере Windows 7 файлам.

Что такое права доступа к NTFS.

Права доступа — разрешение на выполнение операций с определённым объектом, например файлом. Права могут быть предоставлены владельцем или другим имеющим на это право пользователем. Как правило, это администраторы в системе. Если вы являетесь владельцем объекта, то можете предоставить права доступа к этому объекту любому пользователю или группе пользователей.

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

Права доступа к файлам и папкам определяют тип доступа, который предоставляется пользователю, группе или конкретному компьютеру на файл или папку. Например, можно позволить одному пользователю читать содержимое файла, другому вносить в него изменения, а всем остальным пользователям запретить доступ к файлу. Так же можно устанавливать права доступа к папкам.

Существует два уровня прав доступа:

  • Доступ к общей папке: даёт участникам, например определённым пользователям, доступ к общим ресурсам в сети. Права доступа к общим папкам действует только тогда, когда пользователь обращается к ресурсу по сети.
  • Доступ к файловой системе NTFS: даёт доступ к файлам или папкам при подключении по сети или во время входа в систему на локальном компьютере, где расположен ресурс. Доступ по NTFS для файла или папки предоставляется определённой группе или отдельным пользователям.

Существует два типа доступа по NTFS:

  • Стандартные права: наиболее часто используемым разрешением является стандартный доступ к файлам и папкам; к нему относятся основные права: чтение, запись, изменение и полный контроль.
  • Специальные права: особые права доступа, в которых предусмотрена большая точность управления доступом к файлам и папкам. Этот тип прав доступа более сложный в управлении, чем стандартный доступ. К ним относятся права на атрибуты чтения/записи, расширенные атрибуты, удаление вложенных папок и файлов, смена владельца и синхронизация.

Права на наследование.

Существует два типа прав доступа:

  • Прямые права доступа: если объект создаётся действием пользователя, доступ, установлен по умолчанию на не дочерние объекты.
  • Унаследованный доступ: доступ распространяется на объект от родительского объекта. Наследованный доступ облегчает управление разрешениями и обеспечивает единообразие доступа для всех, находящихся в данном контейнере, объектов.

Наследованный доступ позволяет набору NTFS разрешений для папки быть автоматически применённым к файлам, созданным в той папке и её подпапках. Это означает, что разрешения NTFS для всей структуры папки могут быть установлены в одном месте. И если требуются изменения, то их можно сделать в одном единственном пункте.

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

Существует три способа изменения унаследованного доступа:

  • Внести изменения в родительской папке, а затем файлы или папки, унаследуют эти права доступа.
  • Изменить доступ на противоположный (разрешить или запретить), чтобы отменить унаследованный доступ.
  • Выбрать "не наследовать права доступа от родительского объекта", а затем внести изменения в права или удалить группу или пользователя из списка прав доступа к файлу или папке.

В большинстве случаев, если папка наследует конфликтующие параметры от разных родителей, команда "Запретить" переопределяет команду "Разрешить". В этом случае, ближайший к объекту в поддереве наследуемый от родительского элемента параметр, будет иметь приоритет.

Дочерними объектами наследуются только наследуемые права доступа. Когда установлены права доступа к родительскому объекту, в дополнительных настройках безопасности вам нужно установить, могут ли папки или подпапки их наследовать.

Примечание: Если объект имеет прямое право - "Разрешить", запрет на унаследованное право доступа не препятствует доступу к объекту. Прямые права доступа имеют приоритет над унаследованными правами, даже над унаследованным запретом.

Блокировка наследуемых прав доступа.

После установки прав доступа на родительскую папку, созданные в ней новые файлы и папки, наследуют эти права. Для ограничения доступа к этим файлам и папкам наследование прав доступа может быть заблокировано. Например, все пользователи бухгалтерии могут иметь права на папку УЧЕТА "Изменить". На подпапке ЗАРАБОТНАЯ ПЛАТА, наследуемые права доступа могут быть заблокированы, и предоставлены только некоторым определённым пользователям.

Примечание: Когда наследованные права доступа заблокированы, есть возможность скопировать существующие права, либо создать новые. Копирование существующих прав доступа упрощает процесс настройки ограничений для определённой группы или пользователя.

В предыдущих уроках этой главы вы немного узнали о том, как работает базовое наследование. До сих пор во всех наших примерах мы использовали открытое (публичное) наследование. То есть наш производный класс открыто наследовал базовый класс.

В этом уроке мы более подробно рассмотрим открытое ( public ) наследование, а также два других вида наследования: закрытое (частное, private ) и защищенное ( protected ). Мы также рассмотрим, как различные виды наследования взаимодействуют со спецификаторами доступа, чтобы разрешить или ограничить доступ к членам.

К этому моменту вы уже видели спецификаторы доступа public и private , которые определяют, кто может получить доступ к членам класса. Напоминаем, что к открытым ( public ) членам может получить доступ кто угодно. Доступ к закрытым ( private ) членам могут получить только функции-члены этого же класса или друзей. Это означает, что производные классы не могут напрямую обращаться к закрытым членам базового класса!

Это довольно просто, и вы уже должны были к этому привыкнуть.

Спецификатор доступа protected

При работе с наследованными классами всё становится немного сложнее.

В C++ есть третий спецификатор доступа, о котором мы еще не говорили, потому что он полезен только в контексте наследования. Спецификатор доступа protected позволяет получить доступ к члену классу, к которому принадлежит член, друзьям и производным классам. Однако защищенные члены недоступны извне класса.

В приведенном выше примере вы можете видеть, что защищенный член базового класса m_protected напрямую доступен производному классу, но не внешней функции.

Итак, когда мне следует использовать спецификатор доступа protected ?

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

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

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

Различные виды наследования и их влияние на доступ

Во-первых, классы могут наследоваться от других классов тремя разными способами: открытый ( public ), защищенный ( protected ) и закрытый ( private ).

Для этого при выборе класса для наследования просто укажите, какой тип доступа вам нужен:

Если вы не выбрали тип наследования, C++ по умолчанию использует закрытое наследование (точно так же, как члены по умолчанию имеют закрытый доступ, если вы не укажете иное).

Это дает нам 9 комбинаций: 3 спецификатора доступа к членам ( public , private и protected ) и 3 типа наследования ( public , private и protected ).

Так в чем разница между ними? Вкратце, когда члены наследуются, спецификатор доступа для унаследованного члена может быть изменен (только в производном классе) в зависимости от типа используемого наследования. Другими словами, члены, которые были открытыми или защищенными в базовом классе, могут изменять спецификаторы доступа в производном классе.

Это может показаться немного запутанным, но всё не так уж и плохо. Мы посвятим оставшуюся часть урока подробному изучению этого.

При рассмотрении примеров помните о следующих правилах:

  • Класс всегда может получить доступ к своим собственным (ненаследуемым) членам.
  • Сторонний код получает доступ к членам класса на основе спецификаторов доступа класса, к которому он обращается.
  • Производный класс обращается к унаследованным членам на основе спецификатора доступа, унаследованного от родительского класса. Это зависит от спецификатора доступа и типа наследования.

Открытое наследование

Открытое наследование – это, безусловно, наиболее часто используемый тип наследования. Фактически, вы очень редко увидите или будете использовать другие типы наследования, поэтому ваше основное внимание должно быть сосредоточено на понимании этого раздела. К счастью, открытое наследование также легче всего для понимания. Когда вы наследуете базовый класс открыто, унаследованные открытые члены остаются открытыми, а унаследованные защищенные члены остаются защищенными. Унаследованные закрытые члены, которые были недоступны, потому что они были закрытыми в базовом классе, остаются недоступными.

Спецификатор доступа в базовом классеСпецификатор доступа при открытом наследовании
public public
protected protected
private не доступен

Ниже приведен пример, показывающий, как всё работает:

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

Если у вас нет особой причины делать иначе, то вы должны использовать открытое наследование.

Лучшая практика

Используйте открытое наследование, если у вас нет особых причин делать иначе.

Защищенное наследование

Защищенное наследование – наименее распространенный метод наследования. Практически никогда не используется, за исключением очень особых случаев. При защищенном наследовании открытые и защищенные члены становятся защищенными, а закрытые члены остаются недоступными.

Поскольку эта форма наследования встречается очень редко, мы пропустим этот пример и подведем итоги в виде таблицы:

Спецификатор доступа в базовом классеСпецификатор доступа при защищенном наследовании
public protected
protected protected
private не доступен

Закрытое наследование

При закрытом наследовании все члены базового класса наследуются как закрытые. Это означает, что закрытые члены остаются закрытыми, а защищенные и открытые члены становятся закрытыми.

Обратите внимание, что это не влияет на способ доступа производного класса к членам, унаследованным от его родителя! Это влияет только на код, пытающийся получить доступ к этим членам через производный класс.

Подведем итоги в виде таблицы:

Спецификатор доступа в базовом классеСпецификатор доступа при закрытом наследовании
public private
protected private
private не доступен

Закрытое наследование может быть полезно, когда производный класс не имеет очевидной связи с базовым классом, но использует базовый класс для внутренней реализации. В таком случае мы, вероятно, не хотим, чтобы открытый интерфейс базового класса предоставлялся через объекты производного класса (как это было бы, если бы мы наследовали открыто).

На практике закрытое наследование используется редко.

Последний пример

Base может получить доступ к своим членам без ограничений. Внешний код может получить доступ только к m_public . Производные классы могут обращаться к m_public и m_protected .

D2 может получить доступ к своим членам без ограничений. D2 может получить доступ к членам Base m_public и m_protected , но не к m_private . Поскольку D2 наследуется от Base закрыто, при доступе через D2 члены m_public и m_protected теперь считаются закрытыми. Это означает, что внешний код не может получить доступ к этим переменным при использовании объекта D2 , равно как и никакие классы, производные от D2 .

D3 может получить доступ к своим собственным членам без ограничений. D3 может получить доступ к членам m_public2 и m_protected2 класса D2 , но не к m_private2 . Поскольку D3 наследуется от D2 открыто, при доступе через D3 члены m_public2 и m_protected2 сохраняют свои спецификаторы доступа. D3 не имеет доступа к m_private класса Base , который в Base уже был закрытым. У него также нет доступа к членам m_protected или m_public класса Base , которые стали закрытыми, когда D2 унаследовал их.

Резюме

Способ взаимодействия спецификаторов доступа, типов наследования и производных классов вызывает большую путаницу. Чтобы попытаться прояснить ситуацию как можно больше:

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

Во-вторых, когда производные классы наследуют члены, эти члены могут изменять спецификаторы доступа в производном классе. Это не влияет на собственные (ненаследуемые) члены производных классов (которые имеют свои собственные спецификаторы доступа). Это влияет только на то, могут ли посторонний код и классы, производные от производного класса, получить доступ к этим унаследованным членам.

Вот таблица всех комбинаций спецификаторов доступа и типов наследования:

Спецификатор доступа в базовом классеСпецификатор доступа при открытом наследованииСпецификатор доступа при закрытом наследованииСпецификатор доступа при защищенном наследовании
public public private protected
protected protected private protected
private не доступенне доступенне доступен

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

Читайте также: