Содержание
Run a sudo command, specifying the password on the same line
sudo
does not have an option to specify the password, but you can still do the authentication on the command line, like this:
echo password | sudo -u root --stdin
or just
echo password | sudo -S
referring to the sudo manual page:
-S
, --stdin
Write the prompt to the standard error and read the password from the standard input instead of using the terminal device. The password must be followed by a newline character.
and
-u
user, --user=
user
Run the command as a user other than the default target user (usually root). The user may be either a user name or a numeric user ID (UID) prefixed with the ‘#’ character (e.g. #0 for UID 0). When running commands as a UID, many shells require that the ‘#’ be escaped with a backslash (‘’). Some security policies may restrict UIDs to those listed in the password database. The sudoers policy allows UIDs that are not in the password database as long as the targetpw option is not set. Other security policies may not support this.
But sudo
has been under development a long time. Check the version:
-V
, --version
Print the sudo
version string as well as the version string of the security policy plugin and any I/O plugins. If the invoking user is already root the -V
option will display the arguments passed to configure when sudo
was built and plugins may display more verbose information such as default options.
The support for long options was added in 2022.
Besides authenticating, you need something for sudo
to do, e.g., a command. I often check that it is working by doing just
sudo id
which should show the root user, e.g.,
uid=0(root) gid=0(root) groups=0(root)
Итак…
Если официальный контейнер nginx, ingress-nginx или ваш собственный останавливается или перезапускается с ошибкой:
bind() to 0.0.0.0:80 failed (13: Permission denied)
… это означает, что была попытка слушать порт 80 под непривилегированным (не 0) пользователем, и в наборе текущих разрешений не было CAP_NET_BIND_SERVICE. Для получения этих прав необходимо использовать xattr и установить (с помощью setcap) для файла nginx разрешение, как минимум, cap_net_bind_service ie.
Это файловое разрешение будет объединено с унаследованным набором (заданным вместе с ограничивающим набором из pod SecurityContext/capability/add/NET_BIND_SERVICE), и также размещено в наборе доступных разрешений. В результате получится cap_net_bind_service pie.
Это все работает до тех пор, пока securityContext/allowPrivilegeEscalation установлен в true и storage-драйвер docker/rkt (см. документацию docker) поддерживает xattrs.
Если бы nginx был умен по отношению к полномочиям, то cap_net_bind_service i было бы достаточно. Затем он мог бы использовать libcap для расширения прав от доступного набора до эффективного. Получив в результате cap_net_bind_service pie.
Помимо использования xattr, единственным способом получения cap_net_bind_service в не-root контейнере — это позволить Docker установить внешние разрешения (ambient capabilities). Но по состоянию на апрель 2022, это еще не реализовано.
Особенные случаи и замечания
Конечно, в реальности все не так просто, и есть несколько особых случаев, описанных в man-странице
. Наверное, самыми важными из них являются:
Примеры кода
с использованием libcap для добавления
CAP_NET_BIND_SERVICE
в эффективный набор разрешений. Он требует наличия разрешения
CAP_BIND_SERVICE p
для бинарного файла.
Ссылки (анг.):
Разрешения процессов (process capabilities)
Права обычных пользователей очень ограничены, в то время как права пользователя “root” очень обширны. Хотя процессам, запущенным под «root», часто не требуются все полномочия root.
Для уменьшения полномочий пользователя “root” разрешения POSIX (POSIX capabilities) предоставляют способ ограничить группы привилегированных системных операций, которые разрешено выполнять процессу и его потомками. По сути, они делят все «root»-права на набор отдельных привилегий. Идея capabilities была описана в 1997 году в черновике POSIX 1003.1e.
В Linux каждый процесс (задача) имеет пять 64-битных чисел (наборов), содержащих биты разрешений (до Linux 2.6.25 они были 32-битными), которые можно посмотреть в
/proc/<pid>/status
CapInh: 00000000000004c0
CapPrm: 00000000000004c0
CapEff: 00000000000004c0
CapBnd: 00000000000004c0
CapAmb: 0000000000000000
Эти числа (здесь показаны в шестнадцатеричной системе счисления) представляют собой битовые карты, в которых представлены наборы разрешений. Вот их полные имена:
- Inheritable (наследуемые) — разрешения, которые могут наследовать потомки
- Permitted (доступные) — разрешения, которые могут использоваться задачей
- Effective (текущие, эффективные) — текущие действующие разрешения
- Bounding (ограничивающий набор) — до Linux 2.6.25 ограничивающий набор был общесистемным атрибутом, общим для всех потоков, предназначенным для описания набора, за пределы которого разрешения расширяться не могут. В настоящее время это набор для каждой задачи и является лишь частью логики execve, подробности далее.
- Ambient (наружные, начиная с Linux 4.3) — добавлены, чтобы легче предоставлять разрешения не-root пользователю, без использования setuid или файловых разрешений (подробности позже).
Если задача запрашивает выполнение привилегированной операции (например, привязку к портам < 1024), то ядро проверяет действующий ограничивающий набор на наличие
. Если он установлен, то операция продолжается. В противном случае операция отклоняется с EPERM (операция не разрешена). Эти
CAP_
-определены в исходном коде ядра и нумеруются последовательно, поэтому
CAP_NET_BIND_SERVICE
, равный 10, означает бит 1 << 10 = 0x400 (это шестнадцатеричная цифра “4” в моем предыдущем примере).
Полный человекочитаемый список полномочий, определенных на данный момент, можно найти в актуальной man-странице capabilities(7) (приведенный здесь список только для справки).
Кроме того, есть библиотека libcap для упрощения управления и проверки полномочий. В дополнение к API библиотеки в пакет входит утилита capsh, которая, помимо прочего, позволяет показать свои полномочия.
# capsh --print
Current: = cap_setgid,cap_setuid,cap_net_bind_service eip
Bounding set = cap_setgid,cap_setuid,cap_net_bind_service
Ambient set =
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=0(root)
gid=0(root)
groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
Здесь есть несколько запутанных моментов:
Разрешения файлов (file capabilities)
Иногда пользователю с ограниченным набором прав необходимо запустить файл, который требует больше полномочий. Ранее это достигалось установкой бита setuid (
chmod s ./executable
) в бинарном файле. Такой файл, если он принадлежит root, будет иметь полные права root при выполнении любым пользователем.
Но этот механизм предоставляет слишком много привилегий файлу, поэтому POSIX-разрешения реализовали концепцию, называемую “файловые разрешения”. Они хранятся в виде расширенного атрибута файла, называемого “security.capability”, поэтому вам нужна файловая система с поддержкой расширенных атрибутов (ext*, XFS, Raiserfs, Brtfs, overlay2, …). Для изменения этого атрибута необходимо разрешение CAP_SETFCAP (в доступном наборе разрешений процесса).
$ getfattr -m - -d `which ping`
# file: usr/bin/ping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
$ getcap `which ping`
/usr/bin/ping = cap_net_raw ep
Чем грозит физический доступ к системе — реальные заметки ubuntu & mikrotik
В данной заметке я покашу, как имея физический доступ к системе Ubuntu 12.04.4 Desktop/Server amd64 решить поставленную перед собой задачу: «получение административного доступа». Конечно же не все так порой бывает гладко, как описано ниже. Существует множество средств защиты:
Система находится под замком (нельзя взять просто так и перезагрузить систему)
BIOS — под паролем
Перезагрузку заменять, если все-таки каким-либо образом Вы это сделали.
Ниже те действия которым я руководствуюсь когда необходимо решить задачу: «получение административного доступа»
Перезагружаем систему, когда появится загрузочное меню Grub
Нажимаем клавишу «e» для входа в режим редактирования.
Ниже представлен скриншот в режиме редактирования.
Переходим на строку: (см. скриншот выше, чтобы понимать что имеется ввиду)
linux /boot/vmlinuz-3.2.0-23-generic root=UUID=<уникальный_идентификатор> ro и изменяем ro на rw init=/bin/bash и нажимаем клавишу F10 для загрузки с измененными параметрами
После загрузки система встретит нас строкой вида:
символ # говорит, что система загружена с правами администартора
[email protected](none):/#
Далее находясь в консоли, можно пойти по трем шагам:
Создать нового пользователя и добавить его в группу в которой состоит суперпользовательroot ( cat /etc/passwd | grep root, в Ubuntu 12.04 Desktop/Server это группа 0)
[email protected](none):/# adduser kik —gid 0
[email protected](none):/# passwd kik
Enter new UNIX password: [email protected]
Retype new UNIN password: [email protected]
Добавить вашу имеющуюся учетную запись в группу в которой состоит суперпользователь root
[email protected](none):/# adduser <ваша_учетная_запись> —gid 0
Сбросить пароль на учетную запись суперпользователя root
[email protected](none):/# passwd root
По окончании работы перезагружаем систему, чтобы уже загрузиться в действующую и после авторизовать по одному из трех выше шагов.
Авторизуемся в системе под учетной запись kik и видим:
$ (данный символ говорит, что в системе мы в пользовательcком режиме) набираем команду id чтобы отобразить текущий uid пользователя и состоянии групп в которых данных пользователь присутствует:
$ id
uid=1001(kik) gid=0(root) groups=0(root)
как видно то что и требовалось.
По Выше написанному могу сказать, что цель заметки достигнута и приведены и наглядно показаны сообщения выдаваемые системой с получению прав Администратора в системе. На этом все, с уважением ekzorchik.
Определить свой uid, узнать, к каким группам относится ваше регистрационное имя, объяснить вывод команд id, groups. — киберпедия
Для определения нужных данных, воспользуемся командами id и groups без параметров:
[email protected] ~$ id
uid=1017(g1u18) gid=100(users) groups=100(users)
[email protected] ~$ groups
users
При помощи первой команды мы получили значения UID (1017), GID (100) и основную группу пользователя – users. С помощью команды groups мы получили список всех групп, к которым принадлежит пользователь g1u18. Это, опять же, только группа users.
Определить список групп, в которые входит пользователь root.
Проделываем те же операции для пользователя root, для чего исполним команды id и groups с параметром root:
[email protected] ~$ id root
uid=0(root) gid=0(root) groups=0(root)
[email protected] ~$ groups root
root : root
Так же определим UID (0), GID (0) и основную группу (root). Пользователь root так же входит только в одну группу.
12. Узнать, какими правами доступа обладают вновь создаваемые файлы и каталоги (т. е. создать новый файл и новый каталог, и просмотреть для них права доступа).
Выведем список файлов в домашнем каталоге с показыанными правами доступа:
[email protected] ~$ ls -l
total 0
drwx—— 5 g1u18 users 120 Jan 30 2008 Maildir/
Создадим новый каталог:
[email protected] ~$ mkdirtest
Ифайл:
[email protected] ~$ touchfl
Снова посмотрим список файлов с правами доступа:
[email protected] ~$ ls -l
total 4
drwx—— 5 g1u18 users 120 Jan 30 2008 Maildir/
-rw——- 1 g1u18 users 0 Feb 7 17:01 fl
drwx—— 2 g1u18 users 48 Feb 7 17:01 test/
Как видно из исполнения команды, новый каталог имеет права, разрешающие чтение, запись и исполнения пользователю, создавшему его. Новый файл имеет те же права, кроме права исполнения.
Определить значение umask, при котором создаваемые файлы и каталоги будут недоступны для чтения, записи и исполнения никому, кроме владельца.
Права доступа можно определить в числовой форме путем суммированиявосьмеричных значений отдельных битов прав доступа:
400 – владелец имеет право на чтение;
200 – владелец имеет право на запись;
100 – владелец имеет право на выполнение;
040 – группа имеет право на чтение;
020 – группа имеет право на запись;
010 – группа имеет право на выполнение;
004 – остальные имеют право на чтение;
002 – остальные имеют право на запись;
001 – остальные имеют право на выполнение.
Маска прав доступа определяет, какие права должны быть удалены из полного набора прав, т. е. маска прав доступа является обратным значением прав доступа по умолчанию. Для того, что бы сбросить права для всех пользователей, кроме создателя, нужно использовать маску 077. Проверим это на практике:
[email protected] ~$ umask 077
[email protected] ~$ mkdirtest
[email protected] ~$ ls -l
total 4
drwx—— 2 g1u18 users 48 Feb 10 08:25 test/
Действительно, только создатель папки обладает всеми правами. Пользователи группы и все остальные пользователи никакими правами по отношению к папке не обладают.