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キーを使用してログインできますifパスワードがありません。 PAMとsshdの構成によっては、_/etc/shadow
_の[アカウントの有効期限]フィールドを使用してそのようなアカウントを無効にできる場合がありますが、これは不可能であると想定するのが最も安全です。
有効なシェルがあり、_authorized_keys
_がないアカウントの場合は、次に_/etc/shadow
_を確認します。パスワードフィールドには3つの可能性があります。空の場合、パスワードを指定せずにアカウントを使用できます。 (PAMは、このタイプのアカウントへのアクセスをブロックするように構成できますが、これが行われたとは思いません。)パスワードの有効なcrypt(3)
ハッシュである場合は、それを使用してアカウントにアクセスできます。パスワード。 その他の文字列は、パスワードを使用してアカウントにアクセスできないことを意味します。従来は、_*
_、_!
_、または_*LK*
_のいずれかが使用されています。
残念ながら、文字列がsome passwordの有効なcrypt(3)
ハッシュであるかどうかを判断する簡単な方法はありません。ここでの私の推奨事項は、_*
_または_!
_で始まる文字列を、パスワードを使用してアカウントにログインできないことを示すものとして扱い、他の文字列をパスワードを使用してログインできることを示すものとして扱うことです。
技術的には、_/etc/shadow
_の「パスワードの最大有効期間」、「パスワードの非アクティブ期間」、および「アカウントの有効期限」フィールドを使用してユーザーアカウントを無効にすることもできますが、これらを唯一の手段として使用することを躊躇します。アカウントをロックしているので、アカウントがロックされているかどうかを判断するときにも、それらを確認しません。
技術的には、_/etc/passwd
_レコードのパスワードフィールドには、マジックトークンx
(「_/etc/shadow
_を調べてください」を意味します)以外のものが含まれている可能性がありますが、最近では、オペレーティングシステムが壊滅的に誤って構成されていることを示しています。ボックスがpwnされたと想定して、ディザスタリカバリモードに入るのを見たことがあれば。
このPythonスクリプト(_/etc/shadow
_を読み取り、全員のホームディレクトリにアクセスするため、rootとして実行する必要があります)は、すべてのログイン名を出力しますロック解除ユーザー。これには通常、ロックされているすべてのユーザーのリストよりも便利です。これには、興味のないシステムアカウントが多数含まれているためです。
_#! /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など)によって提供されるアカウントについて心配する必要がある場合は、さらに複雑になります。これらをカバーするためにこの答えを拡張する方法がわかりません。