5

Как я могу перечислить всех заблокированных пользователей в Linux?

usermod -L user_name

Эта команда блокирует конкретного пользователя. Есть ли в Linux какая-либо команда, которая выводит список заблокированных пользователей?

3 ответа3

8

passwd -S -a | grep LK | cut -d " " -f1 и / или passwd -S -a |awk '/LK/{print $1}' должны работать.

(если вы заинтересованы)

Обе эти иллюстрации демонстрируют очень распространенную технику, которая используется в Unix/Linux: то, что я буду называть командным конвейером.

В этих примерах выходные данные одной команды (такой как ls) передаются другой команде, которая эффективно фильтрует ее ввод и отправляет ее по линии.

Обратитесь к LinuxQuestions.org для получения дополнительной информации.

2
sudo awk '/!\*/' /etc/shadow | cut -d : -f1

Еще один способ для локальных пользователей.

0

Существующие ответы неточны: они получат ложные отрицания на учетных записях, которые заблокированы с использованием другой техники, отличной от того, как это делает 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). Я не знаю, как расширить этот ответ, чтобы охватить их.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .