воскресенье, 9 декабря 2012 г.

Setuid, Setgid


Поиск файлов с битом setuid

find / -type f -perm -4000 -exec ls -l {} \;

...
-rwsr-xr-x 1 root root 35712 Nov  8  2011 /bin/ping
-rwsr-xr-x 1 root root 40256 Nov  8  2011 /bin/ping6
-rwsr-xr-x 1 root root 69096 Mar 30  2012 /bin/umount
-rwsr-xr-x 1 root root 36832 Sep 13 02:29 /bin/su
-rwsr-xr-x 1 root root 31304 Mar  2  2012 /bin/fusermount
-rwsr-xr-x 1 root root 94792 Mar 30  2012 /bin/mount
...

(Бит setuid, установленный для директорий игнорируется (в большинстве дистрибутивов Linux/Unix))

Поиск файлов и каталогов с битом setgid

find / -perm -2000 -exec ls -l {} \;

...
-rwxr-sr-x 1 root tty 14648 Mar 31  2012 /usr/bin/bsd-write
-rwxr-sr-x 3 root mail 14544 Oct 18  2011 /usr/bin/mail-unlock
-rwxr-sr-x 3 root mail 14544 Oct 18  2011 /usr/bin/mail-touchlock
-rwsr-sr-x 1 daemon daemon 47928 Oct 25  2011 /usr/bin/at
-rwxr-sr-x 1 root mlocate 39472 Aug 17  2011 /usr/bin/mlocate
-rwxr-sr-x 1 root shadow 50760 Sep 13 02:29 /usr/bin/chage
-rwxr-sr-x 3 root mail 14544 Oct 18  2011 /usr/bin/mail-lock
-rwxr-sr-x 1 root utmp 375984 Jun  6  2011 /usr/bin/screen
-rwxr-sr-x 1 root shadow 23168 Sep 13 02:29 /usr/bin/expiry
-rwxr-sr-x 1 root tty 18976 Mar 30  2012 /usr/bin/wall
-rwxr-sr-x 1 root mail 14800 Oct 17  2011 /usr/bin/dotlockfile
-rwxr-sr-x 1 root crontab 35896 Jun 20  2012 /usr/bin/crontab
-rwxr-sr-x 1 root ssh 129104 Apr  2  2012 /usr/bin/ssh-agent
-rwsr-sr-x 1 libuuid libuuid 18856 Mar 30  2012 /usr/sbin/uuidd
...

Поиск файлов и каталогов c обеими битами сразу

find / -perm -6000 -exec ls -l {} \;

...
-rwsr-sr-x 1 daemon daemon 47928 Oct 25  2011 /usr/bin/at
-rwsr-sr-x 1 libuuid libuuid 18856 Mar 30  2012 /usr/sbin/uuidd
...

setuid, setgid для файла:

Когда атрибут setuid установлен файлу (chmod u+s), обычный пользователь, запускающий этот файл на исполнение, получает повышение прав до пользователя-владельца файла (обычно root) в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи выполнение которых обычному пользователю недоступно. Пользователю будет запрещено системой изменение нового процесса. Из-за возможности состояния гонки многие операционные системы игнорируют установленный атрибут к shell-скриптам.
Хоть атрибут setuid очень удобен во многих случаях, его неправильное использование может представлять угрозу безопасности когда атрибут присваивается исполняемому файлу, который не тщательно спроектирован. Пользователи могут использовать уязвимости в недоработанных программах, чтобы получить повышенные привилегии или непреднамеренно запустить программу троянского коня.
Установленный setgid атрибут (chmod g+s) дает аналогичное повышение прав, но только для группы. Атрибуты setuid и setgid обычно устанавливаются командой chmod установкой первого бита в 4 (setuid) или 2 (setgid). Команда "chmod 6711" соответственно установит оба бита сразу (4+2=6). Также можно использовать символьные аргументы для установки этих битов командой "chmod ug+s".
Обычно, установка бита setuid и setgid на неисполняемых файлах бессмысленна.

setuid, setgid для директории:

Бит setgid для папки (chmod g+s) заставляет только новые папки и файлы, созданные в ней, наследовать ID группы этой папки вместо ID группы пользователя создавшего файл. Новые подпапки также наследуют бит setgid. Это например позволяет создать общее рабочее пространство для группы без неудобств членам группы явно менять их текущую группу для создания новых файлов и папок. Наследование устанавливается только для новых файлов и папок.

Бит setuid не несет никакого смысла, если он установлен на директорию.

Полезные shell команды


Nohup

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

nohup <command> &

nohup — UNIX-утилита, запускающая указанную команду с игнорированием сигналов потери связи (hangup)таким образом, команда будет продолжать выполняться в фоновом режиме и после того, как пользователь выйдет из системы. Если стандартным выводом (stdout) команды является терминал, то он и стандартный поток диагностики (stderr) перенаправляются с добавлением в файл «nohup.out» в текущей директории; если это невозможно сделать, то перенаправление происходит в файл «$HOME/nohup.out». Если и это невозможно сделать, то команда не запускается совсем.
При создании файлов «nohup.out» или «$HOME/nohup.out» команда nohup устанавливает им атрибуты доступа только для владельца этих файлов (группа и остальные пользователи не имеют прав доступа к этим файлам). Если же эти файлы уже существуют, то их права доступа не изменяются.
nohup не переводит автоматически команду в фоновый режим; пользователь должен сделать это явным образом, завершив командную строку символом «&».

Работа с сигналами


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

kill -n HUP <PID>

Временная остановка процесса:

Выполняется с помощью отправки сигнала stop:

kill -s STOP 1313, где 1313 PID процесса


после чего в выводе утилиты ps в поле STAT описывающее текущее состояние процесса он засветится как T

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

tsyrenov  1214  0.0  0.0  73360  1796 ?        S    23:06   0:00 sshd: tsyrenov@pts/1
tsyrenov  1215  0.0  0.3  26256  7516 pts/1    Ss+  23:06   0:00 -bash
tsyrenov  1313  0.4  0.1  14616  2200 pts/1    T    23:06   0:02 watch -n0 date


Возобновление работы приостановленного процесса можно выполнить отправкой сигнала CONT

kill -s CONT 1313

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

Гарантированное уничтожение процесса

kill -s KILL <PID>

Уничтожение процесса с созданием дампа памяти

kill -s SEGV <PID>

Nice, renice

Запуск процесса с понижением приоритета на право доступа к cpu (чем выше значение, тем ниже приоритет). Возможный диапазон значений от +20 до -19.

nice -n '12' bash

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

F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND

5  1000 19138 19006  20   0  73360  1788 poll_s S    ?          0:00      \_ sshd: tsyrenov@pts/1
0  1000 19139 19138  20   0  26256  7520 wait   Ss   pts/1      0:00          \_ -bash
0  1000 19238 19139  32  12  22816  3972 n_tty_ SN+  pts/1      0:00              \_ bash

вся дальнейшая работа из под такого shell'а будет выполнятся с пониженным, унаследованным приоритетом 12.

Уже работающим процессам на лету изменить приоритет можно с помощью renice.

Из под пользователя root мы можем на лету изменить приоритет в любую сторону

root@srv:~# renice -22 19238
19238 (process ID) old priority 12, new priority -20

Видим что приоритет у процесса поднялся до -20

5  1000 19138 19006  20   0  73360  1788 poll_s S    ?          0:00      \_ sshd: tsyrenov@pts/1
0  1000 19139 19138  20   0  26256  7520 wait   Ss   pts/1      0:00          \_ -bash
0  1000 19238 19139   0 -20  22816  4072 n_tty_ S<+  pts/1      0:00              \_ bash

С ключом -u можно увеличить фактор уступчивости для всех процессов конкретного пользователя

root@srv:~# renice 10 -u tsyrenov
1000 (user ID) old priority -20, new priority 10

4     0 19006   435  20   0  73360  3540 poll_s Ss   ?          0:00  \_ sshd: tsyrenov [priv]
5  1000 19138 19006  30  10  73360  1788 poll_s SN   ?          0:00      \_ sshd: tsyrenov@pts/1
0  1000 19139 19138  30  10  26256  7520 wait   SNs  pts/1      0:00          \_ -bash
0  1000 19238 19139  30  10  22816  4072 wait   SN   pts/1      0:00              \_ bash

Fuser

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


root@srv:~# fuser -mv /dev
                     USER        PID ACCESS COMMAND
/dev:                root     kernel swap  /dev/dm-1
                     root     kernel mount /dev
                     root          1 F.... init
                     root        306 F.... upstart-udev-br
                     root        310 F.... udevd
                     root        474 F.... sshd
                     messagebus    482 F.... dbus-daemon
                     root        546 F.... upstart-socket-
                     root        579 F.... udevd
                     root        616 F.... udevd
                     root        746 F.... getty
                     root        757 F.... getty
                     root        776 F.... getty
                     root        778 F.... getty
                     root        784 F.... getty
                     root        796 F.... acpid
                     whoopsie    806 F.... whoopsie
                     root        812 F.... cron
                     daemon      813 F.... atd
                     root        844 F.... getty
                     root        864 F.... sshd

root@srv:~# fuser -mv /run/shm
                     USER        PID ACCESS COMMAND
/run/shm:            root     kernel mount /run/shm