Как я могу узнать, какой пользователь вошел в систему как root?
У нас есть пара серверов, которыми управляет большая группа администраторов. Они обычно входят в систему как пользователи сервиса (скажем, hudson ), а затем переключаются на root чтобы сделать небольшое исправление. Это означает, что мы часто не можем отобразить изменения, внесенные в человека.
У кого-нибудь есть скрипт для Unix/Linux, который может сказать мне, какой пользователь вошел в систему как root? Вход в систему может быть со всех компьютеров в локальной сети. Удаленный доступ извне локальной сети как root невозможен; Администраторы должны сначала войти в систему с пользователем локальной сети, а затем могут перейти в root (все они используют SSH).
То, что я хотел бы, является сценарием, который следует за удаленными входами в систему (в локальной сети) и печатает имя пользователя в течение определенного времени. Вы можете предположить, что скрипт может войти через ssh на любой компьютер в локальной сети с правами суперпользователя без запроса пароля.
Предыстория: у меня есть скрипт, который сохраняет резервные копии всех файлов, отредактированных пользователем root. Проблема состоит в том, чтобы выяснить, кто действительно внес изменения.
Безопасность не проблема; дело не в том, чтобы найти хакеров, которые могли очистить wtmp , а в том, чтобы выяснить, кто допустил ошибку, чтобы оставить отзыв.
[РЕДАКТИРОВАТЬ] Некоторые указатели: last команда помогает:
> last -t 20101029174200 root root pts/26 :0.0 Wed Oct 20 15:36 - 15:03 (23:27) wtmp begins Fri Oct 1 16:34:36 2010
Таким образом, root был авторизован через pts/26 . Кто еще сидел на этом псевдо TTY?
> last -t 20101029174200 pts/26 adigulla pts/26 :0 Mon Oct 25 09:45 still logged in adigulla pts/26 :0 Fri Oct 22 14:00 - 17:29 (03:29) adigulla pts/26 :0 Thu Oct 21 15:04 - 16:05 (01:01) root pts/26 :0.0 Wed Oct 20 15:36 - 15:03 (23:27) adigulla pts/26 :0.0 Fri Oct 15 15:57 - 15:57 (00:00) wtmp begins Fri Oct 1 16:34:36 2010
Хм . должно быть я. Так что я могу следить за изменениями пользователя на локальной машине. Если я войду в удаленную машину:
$ last -1 hudson hudson pts/0 192.168.0.51 Fri Oct 29 17:52 still logged in
Таким образом я получаю PTY и IP-адрес, откуда я пришел. Как я могу сделать подключение с выхода last для hudson к пользователю на 192.168.0.51 ?
[EDIT2] Также обратите внимание, что мы обычно меняем пользователя с помощью ssh , а не sudo или su . Это позволяет осуществлять единый вход и избегать необходимости сообщать администраторам любые пароли. Если мы хотим предоставить / отозвать доступ к чему-либо, мы просто добавляем / удаляем открытый ключ из учетной записи службы. Я также знаю, что ssh регистрирует в syslog, но сообщения не говорят мне, какой пользователь переключился на root:
sshd[7460]: Accepted publickey for root from ::1 port 36689 ssh2
7 ответов 7
Я думаю, что лучший способ оставить отзыв администраторам, которые по ошибке вошли в систему как root, — это отключить входы в систему root, но при этом разрешать su и sudo. В качестве альтернативы вы можете отобразить подходящее сообщение обратной связи root .profile, а затем выйти.
Если кто-то, кроме администратора, по ошибке входит в систему как root, вам определенно нужно как минимум изменить пароль root 🙂
Хорошо, вы изменили вопрос, чтобы уточнить, чего вы хотите достичь. Вам необходимо минимизировать количество служб, которые разрешают вход в систему, и обеспечить, чтобы все они записывали успешный вход в систему. SSH записывает успешные входы через системный журнал.
Если несколько человек вошли в систему как «hudson», вам нужно это остановить. Это должна быть политика сайта, которая управляет каждым входом в систему с использованием уникального ИД пользователя.
Вы должны убедиться, что ротация файла журнала настроена так, чтобы вы могли искать старые журналы в течение любого необходимого периода.
Конечно, cron может запланировать сценарий, который ежедневно регистрирует входы в систему из syslog, а также проверяет временные метки критических файлов конфигурации.
Кроме того, существует множество инструментов для мониторинга изменений файла конфигурации. Многие системы Unix имеют подсистему аудита, которая может быть включена и которая также может помочь.
Лично я подозреваю, что лучший способ обеспечить обратную связь в случае ошибки — это не охотиться за кем-то, на кого можно возложить вину, а объяснить проблему всей группе, объяснить, почему изменение было ошибкой, и запросить идеи по предотвращению ошибок. ,
вы должны быть в состоянии определить, кто становится пользователем root, проанализировав /var/log/auth.log .
например, если я имею права root на моем собственном ящике, такая строка вводится в /var/log/auth.log :
Oct 29 20:10:33 localhost su: pam_unix(su:session): session opened for user root by (uid=1000)
Теперь, глядя в /etc/passwd , мы видим:
brad:x:1000:100:brad clawsie. /home/brad:/bin/zsh
что позволяет нам соотнести uid 1000 с именем. Написание сценария perl для этого должно быть очень простым, вы просто присоединяете uid через /var/log/auth.log и /etc/passwd течение определенного промежутка времени, а именно mtime для исследуемого файла.
конечно, если кто-то su получит root и просто выполнит команду touch для файла, который вы исследуете, он установит его mtime, и вы ошибочно поверите, что именно он отредактировал файл.
если бы я рекомендовал наилучшую практику, чтобы избежать ваших проблем, в первую очередь, это было бы хранить все скрипты, кроны, файлы конфигурации . все как файлы в системе контроля версий, которые должны редактироваться реальным пользователем, а затем применяется к живой системе с помощью какого-либо инструмента развертывания (make, apt, что угодно). если люди продолжают ломать вещи, перед развертыванием подписывают их изменения более старшим разработчиком.
ваши резервные копии могут не помочь вам, если вы не смогли сделать копию в нужное время . система контроля версий позволяет вам отозвать столько изменений, сколько вам нужно.
каждый раз, когда файлы в реальных производственных системах редактируются на месте root, это является серьезной проблемой. я не могу сказать в вашем вопросе, является ли hudson реальным человеком в вашей системе или синтетическим пользователем службы (то есть службы hudson). если это искусственный пользователь, я бы спросил, почему этот uid вообще получает «настоящую» оболочку входа в систему.
How do I find who is logged-in as root?
Recently, I have asked «How do I list logged-in users?» The command who serves well for this purpose. But how do I find who is logged-in as root? Will the username «root» be?
4 Answers 4
I assume the root account is not enabled (as it is by default), so only sudo -i is applicable for a user to become root. My suggestion is the following script that uses the commands who -u and pgrep -at to find which user on which tty have executed the command sudo -i .
#!/bin/bash LANG=C who -u | while read -a line; do # Output the whole line: echo "$" IS_ROOT="$(pgrep -at "$" | grep 'sudo -i')" [[ ! -z "$" ]] && printf '%-7s ( PID %-6s at %s on TTY %-7s) is ROOT: %s %s\n' "$" "$" "$" "$" "$IS_ROOT" done | sed '/grep sudo -i/d' | sort -k13 -k6
- who -u shows the users logged on with the PIDs of their sessions. Probably LANG=C is not mandatory — it is placed to guarantee identical time/date format on machines with different locale ‘s settings.
- The loop while will do the commands while there is stream on the stdin.
- The command read -a will read the input stream line by line and will assign these lines as an array to the «variable» $line . We could output the whole line by a command as: echo «$» . So $ means the second variable of the array $line (the first is 0 ). In the current case $ is the TTY from the output of who -u .
- Here is a simple script that will output a «table» with the relations betwen the array elements and their values:
line=( $(LANG=C who -u | head -1) ); for i in ; do printf '%-11s' "$"; done; echo; for i in ; do printf '$ ' "$i"; done; echo guest tty7 2018-01-03 09:52 old 1847 (:0) $ $ $ $ $ $ $
printf '%s some text %s` "$var1" "$var2"
Call the script find-root , make it executable ( chmod +x find-root ) and execute it.
$ ./find-root spas ( PID 14035 at 12:54 on TTY pts/20 ) is ROOT: 23518 sudo -i spas ( PID 14035 at 12:36 on TTY pts/4 ) is ROOT: 23589 sudo -i guest ( PID 23575 at 15:00 on TTY pts/4 ) is ROOT: 23589 sudo -i guest ( PID 24321 at 15:30 on TTY tty1 ) is ROOT: 24386 sudo -i
Here is a demonstration (in a mutt session) how the script works (in its previous version):
Place the script in /usr/local/bin to make it available as shell command. To do that, copy and execute the following lines as single command:
cat " | grep 'sudo -i')" [[ ! -z "\$" ]] && printf '%-7s ( PID %-6s at %s on TTY %-7s) is ROOT: %s %s\n' "\$" "\$" "\$" "\$" "\$IS_ROOT" done | sed '/grep sudo -i/d' | sort -k13 -k6 EOF
How do I list all superusers?
On a linux box, how do I list all users that possess identical privilege to the superuser (and even better, all users in general along with if they are able to escalate their privilege to that level or not)?
Users having the ability to do anything. Basically — I need to list users along with the groups they are members of if it is possible.
If I knew where your computer was, I could walk up and pull the power cord. That would qualify as «do anything» which means I’m on your list. Rafiq has listed the three most common things, but there could be more and we know noting about your system or how it’s setup.
8 Answers 8
Don’t forget to change the root password. If any user has UID 0 besides root, they shouldn’t. Bad idea. To check:
Again, you shouldn’t do this but to check if the user is a member of the root group:
To see if anyone can execute commands as root, check sudoers:
To check for SUID bit, which allows programs to be executed with root privileges:
Strictly, that first one only works if the shadow password file is in user. I agree that it nearly always is, these days, but just in case, I did a quick perl job that explicitly checks field 3.
This is a better pattern than the first one: grep ‘[^:]*:[^:]*:0:’ /etc/passwd . +1 in particular for checking for SUID.
To see who is in groups root , wheel adm and admin :
getent group root wheel adm admin
To list all users and the groups they are members of:
getent passwd | cut -d : -f 1 | xargs groups
Unlike all other answers which wrongly rely on the /etc/passwd file, this one, using getent passwd instead, is actually correct. Just don’t forget to check /etc/sudoers.
All the users in the system are in the /etc/passwd file:
Those who are root have «0» as the user id, which is the 3rd column. Those with «0» as the group (4th column) may also have some root privileges.
Next, you’ll want to look at the groups, and see who is an additional member of the «root» or «wheel» or «admin» groups:
Users listed in those groups could have some root privileges, especially via the «sudo» command.
The final thing you will want to check is the «sudo» config and see who is listed as having authorisation to run this command. This file itself is well documented so I won’t reproduce it here:
That covers the main areas of who could have root access.