Как я могу перечислить всех заблокированных пользователей в Linux?
usermod -L user_name
Эта команда блокирует конкретного пользователя. Есть ли в Linux какая-либо команда, которая выводит список заблокированных пользователей?
Как я могу перечислить всех заблокированных пользователей в Linux?
usermod -L user_name
Эта команда блокирует конкретного пользователя. Есть ли в Linux какая-либо команда, которая выводит список заблокированных пользователей?
passwd -S -a | grep LK | cut -d " " -f1
и / или passwd -S -a |awk '/LK/{print $1}'
должны работать.
(если вы заинтересованы)
Обе эти иллюстрации демонстрируют очень распространенную технику, которая используется в Unix/Linux: то, что я буду называть командным конвейером.
В этих примерах выходные данные одной команды (такой как ls) передаются другой команде, которая эффективно фильтрует ее ввод и отправляет ее по линии.
Обратитесь к LinuxQuestions.org для получения дополнительной информации.
sudo awk '/!\*/' /etc/shadow | cut -d : -f1
Еще один способ для локальных пользователей.
Существующие ответы неточны: они получат ложные отрицания на учетных записях, которые заблокированы с использованием другой техники, отличной от того, как это делает usermod -L
, и они получат ложные срабатывания на учетных записях, в которые можно войти с помощью ключа SSH, но не с помощью пароля. ,
Чтобы выполнить комплексную работу в системе с локальными файлами passwd и shadow и активным демоном SSH, вы должны проверить все эти случаи:
Сначала посмотрите на поле оболочки в /etc/passwd
; если это один из /bin/false
, /sbin/nologin
или /usr/sbin/nologin
, учетная запись безоговорочно блокируется. (В принципе, вы можете использовать все, что не является допустимой программой оболочки, но нет простого способа определить "действительную программу оболочки", и учетные записи специального назначения с необычными программами в этой области довольно распространены, вы не хотите предполагать, что заблокированы.)
Для учетных записей, которые имеют действительную оболочку, затем проверьте, существует ли ~user/.ssh/authorized_keys
или ~user/.ssh/authorized_keys2
, непусто и имеет соответствующие права доступа. (Файл и все его родительские каталоги должны принадлежать как пользователю, так и пользователю root, и должны быть недоступны для записи для всех других учетных записей.) Если это так, в учетную запись можно войти, используя какой-нибудь SSH-ключ, даже если пароль отсутствует. В зависимости от конфигурации PAM и sshd такие учетные записи можно отключить, используя поле "срок действия учетной записи" в /etc/shadow
, но безопаснее предположить, что это невозможно.
Для учетных записей, которые имеют действительную оболочку и не имеют authorized_keys
, проверьте следующее /etc/shadow
. Есть три возможности для поля пароля: если оно пустое, учетная запись может использоваться без указания пароля. (PAM можно настроить для блокировки доступа к этому типу учетной записи, но я бы никогда не предположил, что это было сделано.) Если это действительный хэш crypt(3)
какого-либо пароля, то доступ к учетной записи можно получить с помощью этого пароля. Любая другая строка означает, что к учетной записи нельзя получить доступ с помощью пароля. Условно вы увидите один из *
!
или *LK*
используется.
К сожалению, не существует простого способа решить, является ли строка действительным хешем crypt(3)
какого- либо пароля. Здесь я рекомендую обрабатывать любую строку, начинающуюся с *
или !
как указание, что учетная запись не может быть авторизована с использованием пароля, и любая другая строка, указывающая, что это возможно.
Технически поля "максимальный срок действия пароля", "период бездействия пароля" и "дата истечения срока действия учетной записи" в /etc/shadow
также могут использоваться для отключения учетной записи пользователя, но я не хотел бы полагаться на них как на единственное средство блокировки учетная запись, и поэтому я не буду смотреть на них при принятии решения, заблокирована ли учетная запись, либо.
Технически поле пароля записи /etc/passwd
может содержать что-то иное, кроме магического токена x
(что означает «посмотрите в /etc/shadow
»), но в настоящее время это указывает на катастрофически неверно настроенную операционную систему. Если бы я когда-либо увидел это, я бы предположил, что ящик был свернут, и перешел в режим аварийного восстановления.
Этот скрипт Python (его нужно запускать с правами root, так как он читает /etc/shadow
и вставляет в домашний каталог каждого пользователя), будет печатать логин всех разблокированных пользователей. Это обычно более полезно, чем список всех заблокированных пользователей, поскольку в него входит множество неинтересных системных учетных записей.
#! /usr/bin/python3
import os
import stat
import sys
def get_homes_and_uids_for_users_with_shells():
users = {}
with open("/etc/passwd", "rt") as pf:
for line in pf:
login, x, uid, gid, gecos, home, shell = line.split(':')
if x != 'x':
sys.stderr.write("*** Account '{!r}' not properly shadowed\n"
.format(login))
if shell not in ('/bin/false', '/usr/bin/false',
'/sbin/nologin', '/usr/sbin/nologin'):
users[login] = (int(uid), home)
return users
def check_ssh_auth_perms(path, owner):
owners = (0, owner)
badwritebits = stat.S_IWGRP | stat.S_IWOTH # 0022
# FIXME: I'm not sure whether sshd allows symlinks at any point in this
# path. Conservatively assume it does.
# FIXME: Doesn't check for ACLs.
try:
st = os.stat(path)
except FileNotFoundError:
return False
if (st.st_size == 0 or st.st_uid not in owners
or not stat.S_ISREG(st.st_mode)
or stat.S_IMODE(st.st_mode) & badwritebits):
return False
while True:
path = os.path.dirname(path)
# Not necessary to check for ENOENT; if we got here at all,
# the entire chain of parent dirs must exist
st = os.stat(path)
if (st.st_uid not in owners
or not stat.S_ISDIR(st.st_mode)
or stat.S_IMODE(st.st_mode) & badwritebits):
return False
if path == '/': break
return True
def get_users_with_ssh_keys(all_users):
ssh_users = set()
already_processed_homes = {}
for login, (uid, home) in all_users.items():
if home in already_processed_homes:
if already_processed_homes[home]:
ssh_users.add(login)
continue
if (check_ssh_auth_perms(home + "/.ssh/authorized_keys", uid)
or check_ssh_auth_perms(home + "/.ssh/authorized_keys2", uid)):
already_processed_homes[home] = True
ssh_users.add(login)
else:
already_processed_homes[home] = False
return ssh_users
def get_users_with_possible_passwords():
pw_users = set()
with open("/etc/shadow", "rt") as sf:
for line in sf:
login, phash, chg, mina, maxa, warn, inact, expir, res \
= line.split(':')
if not phash:
sys.stderr.write("*** Account '{!r}' has blank password\n"
.format(login))
if phash[0] != '*' and phash[0] != '!':
pw_users.add(login)
return pw_users
def main():
users = get_homes_and_uids_for_users_with_shells()
ssh_users = get_users_with_ssh_keys(users)
pw_users = get_users_with_possible_passwords()
active_users = set(users.keys()) & (ssh_users | pw_users)
for u in sorted(active_users):
sys.stdout.write(u + "\n")
main()
Это еще сложнее, если вам нужно беспокоиться об учетных записях, предоставляемых службой сетевой аутентификации (например, NIS, LDAP, Kerberos). Я не знаю, как расширить этот ответ, чтобы охватить их.