Часто задаваемые вопросы по OpenEdge RDBMS
XI. Безопасность
Смотрите раздел о подключении к базе данных для дополнительных связанных вопросов.
87. Какие права должен иметь процесс сервера базы данных?
Некоторые из программ в каталоге $DLC/bin должны принадлежать пользователю root и иметь включенный бит setuid. Программы выполняются путем организации процесса с помощью системного вызова exec(), это то, что делает shell, когда вы запускаете _progres. Если выполняемый программный файл имеет включенный бит setuid, то эффективный идентификатор пользовательского процесса устанавливается в идентификатор пользователя владельца файла. В случае _progres, это, обычно, пользователь root (user id 0).
Когда _progres запускается, он вначале работает под идентификатором пользователя root, что означает, что он временно имеет права выше, чем пользователь, который его запустил. Это позволяет процессу открыть файлы базы данных на чтение и запись, независимо от установленных битов доступа файла базы данных (а также позволяет ему подключаться к сегментам разделяемой памяти). После того, как базы данных, указанные в командной строке, были открыты, и была выполнена некоторая инициализация, _progres изменяет свой эффективный идентификатор пользователя на идентификатор запустившего его пользователя (реальный идентификатор пользователя процесса). После этого при открытии файлов проверяются права доступа этого пользователя.
После того, как эффективный идентификатор пользователя был изменен, для _progres в дальнейшем невозможно переключиться обратно к использованию привилегий пользователя root.
Следующие исполняемые файлы должны обычно иметь setuid root (что означает, что владельцем файла является root и бит setuid включен):
- _progres
- _mprosrv
- _mprshut
- _sqlsrv2
Нормальным пользователям обычно не нужно использовать _mprosrv, _mprshut, или _sqlsrv2. Если все пользователи принадлежат одной группе, то бит доступа x для _progres должен быть включен для владельца и группы, но не для остального мира.
В дополнение к этому, никакие исполняемые файлы не должны иметь разрешения на чтение или запись для группы или мира.
Утилиты базы данных, такие, как proutil, rfutil, и т.д. должны иметь доступ на выполнение только для владельцев базы данных, и ни группа, ни мир не должны иметь прав rwx. Для управления журналами After-Image утилита _rfutil должна быть setuid root, а утилита _proutil должна быть setuid root для добавления экстентов в онлайн.
Так как вы спрашиваете о правах, мы рекомендуем вам получить версию программы sudo для вашей операционной системы и научиться ею пользоваться. Программа sudo позволяет избранным пользователям выполнять конкретные команды с привилегиями root без необходимости для этих пользователей знать пароль root. Она также может регистрировать все, что она делает, в журнале. Воспользуйтесь Google или другой поисковой системой.
88. Почему некоторые программы OpenEdge должны быть setuid root?
Некоторые программы должны принадлежать пользователю и иметь включенный бит setuid по следующим причинам:
- Эти программы могут получить доступ к базам данных от имени обычных пользователей, которые не имеют разрешения на чтение или запись файлов базы данных. Это предполагает, что файлы базы данных вообще недоступны обычным пользователям, так как их биты доступа позволяют открытие на чтение и запись только для владельца базы данных и для группы администраторов. Обычные пользователи не могут создавать копии базы данных и не могут использовать текстовый редактор или другие программы для изменения файлов или их чтения.
- Эти программы подключаются к сегментам области разделяемой памяти базы данных, что недоступно обычному пользователю.
- Эти программы устанавливают их значение ulimit выше типичного значения для обычного пользователя. Это связано с тем, что файлы баз данных часто очень большие, и с большим значением ulimit они могут быть расширены при необходимости.
- Эти программы иногда координируют их действия, посылая сигналы друг другу. Например, когда база данных останавливается, брокер базы данных посылает сигналы всем процессам, которые подключены к базе данных, чтобы информировать их о необходимости отключиться.
Заметим, что производственные системы обычно не должны иметь установленных development-лицензий OpenEdge. Вы должны использовать runtime и client-networking. Разработчики OpenEdge не должны обычно иметь доступ к производственной системе.
89. Какие права доступа следует использовать для файлов базы данных?
На Linux и UNIX системах, права доступа к файлам и каталогам для процесса определяются эффективным идентификатором пользователя процесса, эффективным идентификатором основной группы (в некоторых системах пользователь может принадлежать более чем одной группе, перечисленной в файле /etc/group), идентификатором владельца файла, идентификатором группы владельца и 12 битами контроля доступа файла.
Доступ к файлу
Файл имеет 3 набора по 3 бита доступа (смотрите руководство по команде chmod), «r», «w», и «x» (r – чтение, w – запись, и x – выполнение) для владельца файла, членов группы владельца файла и для всех остальных пользователей (для «мира»). Бит «x» не имеет значения для файлов базы данных, он нужен для программ, скриптов shell и каталогов.
Имеется также три других бита доступа специального назначения: бит setuserid, бит setgroupid, и «sticky» бит.
Если биты доступа rw включены для владельца файла и группы, то когда процесс (например, выполняющий программу _progres) пытается открыть файл для чтения и записи, открытие разрешено, если выполняется одно из следующих условий:
- Эффективный идентификатор пользователя процесса – root (uid 0),
- Эффективный идентификатор пользователя процесса равен uid владельца файла,
- Идентификатор группы в списке эффективных групп процесса совпадает с gid группы файла.
Аналогично, если биты rw включены для «мира», то процесс может открыть файл, даже если эффективный идентификатор пользователя процесса и идентификатор группы не совпадают с их значениями для файла.
Доступ к каталогу
Каталоги также имеют биты доступа rwx для владельца, группы и мира, но их значения не вполне совпадают со значениями для файлов. Когда установлен бит «r», это значит, что разрешено чтение каталога (например, с помощью команды ls). Когда установлен бит «w», это значит, что разрешена запись в каталог. Это включает создание, удаление, и перемещение файлов. Когда установлен бит «x», это значит что вы можете войти (cd) в каталог.
Если для каталога установлен бит setgroupid, это означает, что все создаваемые в каталоге файлы будут наследовать группу от каталога, а не от создающего файлы процесса.
Если для каталога установлен «sticky» бит («sticky» не влияет на исполняемые файлы – это было давно и неправда), то процессы, которые имеют право на запись могут создавать и модифицировать файлы, но не могут удалять файлы, если эффективный идентификатор пользователя удаляющего файлы процесса не равен 0, не совпадает с владельцем файла или владельцем каталога.
Доступ к файлам базы данных
В большинстве случаев, когда безопасность базы данных имеет значение, нельзя, чтобы обычные пользователи имели доступ к любым файлам базы данных или каталогам, в которых они находятся. Весь доступ к базе данных обеспечивается приложением 4GL, исполняемым программной _progres, или посредством OpenEdge SQL Server через JDBC или ODBC.
Файлы базы данных (не забывайте о резервных копиях, архивах after-image, дампах данных, и других производных файлах) должны принадлежать кому-то, кто назначен администратором базы данных, или члену группы администраторов баз данных. Они не должны принадлежать пользователю root.
Права на чтение и запись для файлов базы данных должны быть установлены только для владельца базы данных.
Если имеется группа администраторов баз данных, то она тоже должна иметь права на чтение и запись, и только администраторы баз данных должны быть членами этой группы. Если группы администраторов баз данных нет, то все биты доступа для группы должны быть выключены для файлов базы данных и каталогов, в которых они находятся.
Другие пользователи не должны иметь никакого доступа к файлам базы данных или любым каталогам, в которых эти файлы находятся. Все биты доступа для остальных пользователей должны быть выключены.
Биты «x», «sticky» бит, бит setuid и бит setgid должны всегда быть выключены для файлов базы данных.
Когда вы запускаете сервер, биты доступа к сегментам области разделяемой памяти устанавливаются равными битам доступа файла «.db» базы данных.
Заметим, что в дополнение к правам доступа к файлам, описанным выше, вы также можете использовать списки контроля доступа для управления доступом к файлам базы данных.
Добавление экстентов в режиме онлайн и права доступа
Когда экстенты добавляются в режиме онлайн, файлы новых экстентов базы данных создаются утилитой prostrct addonline. Биты прав доступа, идентификатор владельца и идентификатор группы для этих новых файлов определяются идентификатором пользователя и идентификатором группы процесса, который их создает, а также значением бита sticky каталога экстента базы данных.
После того, как эти файлы экстентов базы данных созданы, все процессы, которые уже прямо подключены к базе данных, должны их открыть. Они, вероятно, открыли остальные файлы базы данных очень давно, используя расширенные привилегии. Брокер и серверы базы данных обычно не имеют проблем с открытием новых файлов, так как, в отличие от _progres, они не изменяют их эффективный идентификатор пользователя после завершения инициализации.
Так как самообслуживающиеся процессы _progres изменяют их эффективный идентификатор пользователя на идентификатор пользователя, который их запустил, они больше не имеют расширенных привилегий, которые они имели при инициализации, и не имеют возможности вновь расширить их. Так что они могут открыть новые файлы только в том случае, если идентификатор группы в списке эффективных идентификаторов групп процесса совпадает с идентификатором группы файла. Это является причиной того, что требуется действовать иначе, чем мы рекомендовали выше в отношении пользователей и групп. Чтобы иметь возможность открыть новый файл экстента, обычные пользователи должны принадлежать к группе, совпадающей с группой файла экстента.