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のバージョンによって設定されている値が異なる場合があります。
設定項目 | 初期設定値 | 内容 |
---|---|---|
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
ユーザ情報ファイルの削除
ユーザ情報ファイルには、パスワード情報も含まれているので、ユーザの作成が終わったら忘れずに削除しましょう。
コメント
そこで、「newusers」を実行してから「/etc/skel」の中身をコピーするシェルスクリプトを作成してみました。
1
2
3
4
5
6
7
8
9
10
#!/bin/sh
USERDATA=”./user.txt”
newusers $USERDATA
for user in `cut -d: -f1 $USERDATA`
do
cp /etc/skel/\.[a-z]* /home/$user
chown -R $user:$user /home/$user
done
そのままだとエラーになります。
エラーメッセージ
cp: ディレクトリ `/etc/skel/.mozilla’ を省略しています
誤: cp /etc/skel/\.[a-z]* /home/$user
正: cp -r /etc/skel/\.[a-z]* /home/$user
ちゅらさん
コメントありがとうございます。
X Windows環境でFirefoxがインストールされている場合は「/etc/skel/.mozilla」というディレクトが作成されるのですね。
CUI環境でしか試していなかったのでこのエラーが発生したことがありませんでした。
ご指摘ありがとうございます!!
本文の方を修正させていただきます。