server-memo.net

ユーザ作成・追加の方法

      2017/02/03

CentOS(redhat系)でのユーザの作成方法です。

useraddを使ったユーザ作成

「useradd」コマンドを使用したユーザの作成・追加方法です。

useradd書式

useradd [オプション] [ユーザ名]
オプション一覧
オプション 内容
-c [コメント] コメントを設定
-d [ホームディレクトリ] ホームディレクトリを指定
-e [ユーザアカウントの使用期限(EXPIRE) ] ユーザアカウントの使用期限「YY-MM-DD」形式で指定
-f [日数(INACTIVE)] パスワードの有効期限が切れてから、アカウントが使用不能になるまでの日数
-g [gid or グループ名] 主グループのgid(グループ)を指定
-G [gid or グループ名 ] 主グループ以外のグループに属させる場合に指定 複数の場合は「,」で区切り設定
-m ホームディレクトリがない場合にホームディレクトリを作成する
「-m」オプションを指定する場合は、「-k」オプションを指定し、skelをコピーするディレクトリを指定することが出来る
-o 重複したuidを持つユーザを作成する
-p [パスワード] cryptでハッシュ化されたパスワードを指定する必要がある
-s [シェル] ログインシェルを指定
-u [uid] uidを指定

ユーザ作成例(オプション指定無し)

「taro」というユーザを作成する例です。

# useradd taro
# passwd taro
ユーザー taro のパスワードを変更。
新しいパスワード: <---パスワードの入力
新しいパスワードを再入力してください: <---パスワードの入力
passwd: すべての認証トークンが正しく更新できました。

オプションで指定しない限り、作成したユーザにはパスワードが設定されていないので「passwd」コマンドでパスワードも忘れずに設定しましょう。

ユーザ作成例(オプション指定あり)

下記の項目をオプションで指定して、ユーザを作成する例です。

  • ユーザ名:taro2
  • ログインシェル: zsh(-s オプションで指定)
  • ユーザID(uid): 10000(-u オプションで指定)
  • ホームディレクトリ: /home/users/taro2 (-d オプションで指定)
# useradd -s /bin/zsh -u 10000 -m -d /home/users/taro2 taro2

オプションを指定しない場合について

「uid」「ホームディレクトリ」「ログインシェル」等は「useradd」コマンドの設定にしたがって設定・作成されます。

オプションを指定しない場合の「useradd」コマンドの挙動は「useradd -D」コマンドと「/etc/default/useradd」を確認することでわかります。

「useradd -d」実行結果

# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

各項目の内容は下記のとおりです。

設定項目 内容
GROUP 指定されていない場合の所属グループ
HOME ホームディレクトリの作成場所「/home」ディレクトリの下に作成される
INACTIVE パスワードの期限が切れてから、アカウントが無効になるまでの期間(-1)は期限無し
EXPIRE パスワードの有効期限
SHELL ログインシェル
SKEL skeletonファイルのある場所
CREATE_MAIL_SPOOL メールスプールを作成するかの設定

そのほかの設定は「/etc/login.defs 」で設定されています。

/etc/login.defs

「CentOS 7.1」の「login.defs」について説明します。

※各項目は、OSのバージョンによって設定されている値が異なる場合があります。

/etc/login.defs設定
設定項目 初期設定値 内容
MAIL_DIR /var/spool/mail メールデータの保存場所
PASS_MAX_DAYS 99999 パスワードの有効期限(99999)は有効期限無し
PASS_MIN_DAYS 0 パスワードを再変更が出来るようになるまでの日数
PASS_MIN_LEN 5 パスワードの最小長さ
PASS_WARN_AGE 7 パスワード有効期限切れ前に警告を通知する日数
UID_MIN 1000 UIDの最小範囲
UID_MAX 60000 UIDの最大範囲
SYS_UID_MIN 201 システムアカウントのuid最小範囲
SYS_UID_MAX 999 システムアカウントのuid最大範囲
USERDEL_CMD /usr/sbin/userdel_local ユーザ削除時に実行するコマンドを設定(コメント化されていて設定なし)
CREATE_HOME yes ホームディレクトリを作成するかの設定(ここがyesだと-mオプションをつけなくてもホームディレクトリを背作成してくれる)
UMASK 077 ユーザが作成ファイル・ディレクトリ等を作成する際のumask値
USERGROUPS_ENAB yes ユーザ作成時に同じ名前のグループをつくるかどうかの設定
ENCRYPT_METHOD SHA512 パスワードのハッシュ(暗号化)方式

「CentOS 7.1」の「/etc/login.defs」です。

#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#

# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR      Maildir
MAIL_DIR        /var/spool/mail
#MAIL_FILE      .mail

# Password aging controls:
#
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                  1000
UID_MAX                 60000
# System accounts
SYS_UID_MIN               201
SYS_UID_MAX               999

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                  1000
GID_MAX                 60000
# System accounts
SYS_GID_MIN               201
SYS_GID_MAX               999

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME     yes

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK           077

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes

# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512

パスワードの設定(useradd -p)について

オプションの「useradd -p」でユーザ作成時にパスワードも設定することが出来るのですが、その際指定するパスワードは「crypt」にてハッシュ化されたパスワードである必要があります。

ですので、平文で指定してもパスワードは設定されません。

perlのcryptを使用

perlのcryptを使って、パスワードをハッシュ化させる例です

perl -e 'print crypt("[パスワード]", "\$6\$[salt]");'
saltとは

パスワードを暗号化する際に追加する文字列のことを言います。

このsaltをパスワードに追加してハッシュ化を行い、パスワードの特定しづらくさせています。[salt]の部分は適当な文字列を設定します。

また、「$6$」部分は、ハッシュ化の方式を指定しています。

ハッシュ化方式一覧
$1$ MD5
$2$ Blowfish
$5$ SHA-256
$6$ SHA-512

perlを使ったパスワードのハッシュ(SHA-512)

パスワードを「password」、saltを「saltsalt」として、ハッシュする実行例です。

# perl -e 'print crypt("password", "\$6\$saltsalt");'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

作成したハッシュ化されたパスワードを使って「taro3」ユーザを作成する例です。

# useradd -p \$6\$saltsalt\$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/ taro3

※「$」の前に「\」をつける必要があります。(3箇所あります)

「useradd」コマンドへの組み込み

ユーザを作成する際に毎回、パスワードをハッシュし、コピペするのも手間がかかるので、「useradd」コマンドに組み込んでしまうと、わざわざパスワードをコピペしなくても良くなります。

testuser1を作成
# useradd -p $(perl -e 'print crypt("password", "\$6\$saltsalt")') testuser1
/etc/shadow確認

無事にパスワードが設定されているか、「/etc/shadow」を確認してみます。

# grep testuser1 /etc/shadow
testuser1:$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/:16739:0:99999:7:::

無事パスワードが登録されていることが、確認できました。

あとは、実際に作成したユーザでログインするなりして確認してみてください。

※「useradd -p」を使うと、パスワードもユーザ作成時に登録できて便利なのですが、入力するコマンドが長くなるのが嫌なので、私はいつも「useradd」でユーザ作成した後に「passwd」コマンドでパスワードを設定しています…

おなじ(重複)uidを持ったユーザ作成

「useradd -o」で既存のユーザと同じuidを持ったユーザを作成することが出来ます。

セキュリティ上の理由でrootを/sbin/nologinとかにして、root権限を持った別のユーザを作成するときとかにつかったりします。

作成例

「uid」「gid」ともに「root」と同じ「admin」という名のユーザを作成しています。

# useradd -o admin -u 0 -g 0 -d /root

/etc/passwdの中身抜粋

ユーザ作成後に「/etc/passwd」ファイルを確認すると、「uid」「gid」がともに「0」であることが確認できます。

root:x:0:0:root:/root:/bin/bash
admin:x:0:0::/root:/bin/bash

実際に、「admin」ユーザになってみるとどうなるのでしょう?

「id」コマンドと「whoami」コマンドで確認してみました。

$ su - admin
パスワード:
# id
uid=0(root) gid=0(root) groups=0(root)
# whoami
root

「uid」「gid」ともに「root」と同じなので、どちらも「root」と表示されます。

useraddとadduserの違い

CentOSの場合 adduserコマンドはuseraddコマンドへのリンクとなっていて、同じものとなっています。

# ls -la /sbin/adduser
lrwxrwxrwx. 1 root root 7  6月  5 15:22 /sbin/adduser -> useradd

ユーザ作成時のログ

「useradd」コマンドを使ってユーザを作成した場合、そのログはRHEL系(Redhat・CentOS等)ならば、「/var/log/secure」に記録されます。

/var/log/secure抜粋

# grep useradd /var/log/secure
Nov  5 06:36:05 wp useradd[3334]: new group: name=taro3, GID=20010
Nov  5 06:36:05 wp useradd[3334]: new user: name=taro3, UID=20010, GID=20010, home=/home/taro3, shell=/bin/bash
Nov  5 06:41:54 wp useradd[3493]: new group: name=testuser2, GID=20011
Nov  5 06:41:54 wp useradd[3493]: new user: name=testuser2, UID=20011, GID=20011, home=/home/testuser2, shell=/bin/bash

大量ユーザの追加(newusers)

大量のユーザを作成する場合に「useradd」コマンドを使用すると、スクリプトなどを作成しない限りユーザの数だけコマンド入力する必要があり、非常に手間がかかってしまいます。

その手間を省くために「newusers」コマンドを使用することで、ユーザの一括作成が可能となります。(「/etc/skel」の内容はコピーされないというデメリットはありますが…)

newusers書式

newusers ユーザ情報ファイル

ユーザ情報ファイル書式

「newusers」コマンドを使用する際には、ユーザ情報を事前に用意する必要があり、書式は「/etc/passwd」と同じとなっています。

ユーザー名:パスワード:ユーザーID:グループID:コメント:ホームディレクトリ:ログインシェル

newusers実行例

実際に「newusers」コマンドでユーザを作成してみます。

ユーザ情報ファイル

「test1」から「test9」までの9ユーザ分のリストを「user.txt」という名前で作成しました。

# cat user.txt
test1:test1:20001:20001::/home/test1:/bin/bash
test2:test2:20002:20002::/home/test2:/bin/bash
test3:test3:20003:20003::/home/test3:/bin/bash
test4:test4:20004:20004::/home/test4:/bin/bash
test5:test5:20005:20005::/home/test5:/bin/bash
test6:test6:20006:20006::/home/test6:/bin/bash
test7:test7:20007:20007::/home/test7:/bin/bash
test8:test8:20008:20008::/home/test8:/bin/bash
test9:test9:20009:20009::/home/test9:/bin/bash

※今回はユーザ名とパスワードを同じ設定し、コメントは設定していません。

newusers実行

作成したリスト「user.txt」を使用して、「newusers」コマンドを実行します。

# newusers user.txt

特にメッセージ等は表示されませんが、これでユーザが作成されています。

確認として、「/etc/passwd」ファイルと「/etc/shadow」ファイルを確認してみます。

/etc/passwd

# grep test* /etc/passwd
test1:x:20001:20001::/home/test1:/bin/bash
test2:x:20002:20002::/home/test2:/bin/bash
test3:x:20003:20003::/home/test3:/bin/bash
test4:x:20004:20004::/home/test4:/bin/bash
test5:x:20005:20005::/home/test5:/bin/bash
test6:x:20006:20006::/home/test6:/bin/bash
test7:x:20007:20007::/home/test7:/bin/bash
test8:x:20008:20008::/home/test8:/bin/bash
test9:x:20009:20009::/home/test9:/bin/bash

/etc/shadow

# grep test* /etc/shadow
test1:$6$5irZo/dRa/$6J7BaIn2/i74U8uTNcl295xWSccBmb2FcShAD3v79Wg6Q5UBGkQoRtwbr0vBSrX7KxvWkWAkO38LphLc.g5pk.:16744:0:99999:7:::
test2:$6$YBnUTrkQ4G/6h$uTGBrXMRine/mjHi/f6TeFVVtCgc5RnksWofzFIhjnRJsGvzcunncvsp6TUZ4jmjdXI.oBA299XKk36UhNf.v.:16744:0:99999:7:::
test3:$6$3NwC5LqHjVgm$9r/GsXmarHLLNRWyoVoFMZhPB2F.QBi5QRFg3awGwsTycQmLDAsPE1GkjlAFhlPhOWhJjc.44ovZ1VPRf3qyG.:16744:0:99999:7:::
test4:$6$tgyHRHHVaHtJu$1xg0fzT6UFET7xS3IUjItjLdGpveJTIZ2944xs..ANmK7nVOhDXz.LulwCy33jogUiTxvmaiELyrGgpoJQOyj/:16744:0:99999:7:::
test5:$6$GJ/1FC1RoH$QxkzgH20qx7v9cQr/p5wSnU0.wCWo/YSh6HKxwOeITIOo9yLoFOwOPBJp7FHv7CuxUqtY9YDGlCKQ31glwHRR.:16744:0:99999:7:::
test6:$6$qryWC/T0aJl5$tKxeQUXZk5Tel.PW9GIf5m0ASy1IHTm3YFAAG8PR/gMApTTr5GwvtAaN0YW1VYbh85NvpOVfzszAcCsXu/XV4/:16744:0:99999:7:::
test7:$6$EaGqyNniDdZy$0p.aETnf2rhoSyracNdmrsfJrtgeszQoeHoLUL/AEURTqqU2GB4g6OdfHkSZ0LCk5d3g.25LxXaXCaR4OYbuP0:16744:0:99999:7:::
test8:$6$0RQbc/pz$pxiqQmwZOHmE6rmA8Jsxy9c4lsGp4K5g4y0LwiJVXE8vrwYPwBaSLhMp2EFujJ52Pkuxoyknvo0pfLZXIBMj6.:16744:0:99999:7:::
test9:$6$CZrLaFwXH$FqN9v3SgSiiCyZ4u1ET/XprXEXoaospf4oTOdr8IjObFCl8tSmsOm527kKgANjoZOcm99gel6JqXcUId8oopq1:16744:0:99999:7:::

無事登録できていることが確認できました。

ホームディレクトリも作成されています。

# ls -la /home/ | grep test*
drwx------   2 test1     test1        6 11月  5 15:09 test1
drwx------   2 test2     test2        6 11月  5 15:09 test2
drwx------   2 test3     test3        6 11月  5 15:09 test3
drwx------   2 test4     test4        6 11月  5 15:09 test4
drwx------   2 test5     test5        6 11月  5 15:09 test5
drwx------   2 test6     test6        6 11月  5 15:09 test6
drwx------   2 test7     test7        6 11月  5 15:09 test7
drwx------   2 test8     test8        6 11月  5 15:09 test8
drwx------   2 test9     test9        6 11月  5 15:09 test9

「.bashrc」等のファイルはコピーされていません…

# ls -la /home/test1
合計 4
drwx------   2 test1 test1    6 11月  5 15:09 .
drwxr-xr-x. 20 root  root  4096 11月  5 15:09 ..

skelのコピーをどうするか

「newusers」コマンドは、一括にユーザを登録できるのですが、「/etc/skel」ディレクトリの「.bash_logout」「.bash_profile」「.bashrc」等のファイルが、ユーザのホームディレクトリにコピーされないという問題があります。

そこで、「newusers」を実行してから「/etc/skel」の中身をコピーするシェルスクリプトを作成してみました。

#!/bin/sh
USERDATA="./user.txt"

newusers $USERDATA

for user in `cut -d: -f1 $USERDATA`
  do
    cp -r /etc/skel/\.[a-z]* /home/$user
    chown -R $user:$user /home/$user
  done
2017.02.02 スクリプト修正
  • 変更前 cp /etc/skel/\.[a-z]* /home/$user
  • 変更後 cp -r /etc/skel/\.[a-z]* /home/$user

X Windows環境でFirefoxがインストールされた場合「/etc/skel」ディレクトリ内に「.mozilla」というディレクトリが作成されます。
この場合変更前のスクリプトだと「.mozilla」ディレクトリはコピーされませんでしたので、cpコマンドに「-r」オプションを付けて「/etc/skell」内にディレクトリが作成された場合にも対応できるように変更しました。

「USERDATA」の部分で、ユーザ情報が記載されたファイルを指定しています。

「newusers」コマンドで使用した、ユーザ情報ファイルを使用し「ユーザ名」を取得して、それを元にファイルのコピーを行っています。

コピーするファイルのあるディレクトリや、ユーザのホームディレクトリの場所が異なる場合は、適宜変更してください。

使い方

ユーザ情報ファイルの作成

はじめに作成するユーザ情報ファイルを作成します。

# vi user.txt
スクリプトの作成・実行

適当な名前で上記のスクリプトを作成(今回はuser-add.shとしています)し、実行権限をつけて実行してください。

# vi user-add.sh
# chmod 744 user-add.sh
# ./user-add.sh
ユーザ情報ファイルの削除

ユーザ情報ファイルには、パスワード情報も含まれているので、ユーザの作成が終わったら忘れずに削除しましょう。

 - システム設定