Linux関連

提供: Eospedia
2020年9月15日 (火) 03:09時点におけるKttn (トーク | 投稿記録)による版

移動: 案内検索

ネットワーク関連

ポートスキャン

nmap (Network Mapper)を使えば、あるIPアドレスをもつ計算機が、どのポートを外部に開放しているかを調べることができる。

> nmap -Pn 192.168.4.xx
   Starting Nmap 7.60 ( https://nmap.org ) at 2020-07-16 16:47 JST
   Nmap scan report for <ホスト名> (192.168.4.xx)
   Host is up (0.47s latency).
   Not shown: 999 filtered ports
   PORT   STATE SERVICE
   22/tcp open  ssh

   Nmap done: 1 IP address (1 host up) scanned in 69.83 seconds

といった感じで、tcp22番ポートがsshプロトコル用に開放されていることがわかる。

ポート、サービスの開放状態の確認

firewall-cmdを使う。

> firewall-cmd --list-all
   public (active)
     target: default
     icmp-block-inversion: no
     interfaces: enp129s0
     sources:
     services: dhcpv6-client snmp ssh
     ports:
     protocols:
     masquerade: no
     forward-ports:
     source-ports:
     icmp-blocks:
     rich rules:

DHCP, SNMP, SSHに応答できるよう設定してあるのがわかる。

ポート開放

参考:

firewall-cmdを使う。例えば2377番ポートをTCP用に開けるならば以下の様にする。

> firewall-cmd --zone=public --add-port=2377/tcp
> firewall-cmd --reload

特定のポートが使用中か否かのチェック

lsofコマンドを使う。

> lsof -i:<ポート番号>

使われていなければ何も表示されない。

ファイルサーバー関連

autofsを有効化する

/netが存在しない、または/net内でファイルサーバーのディレクトリに入ろうとしてもエラーが出る場合、autofsが動いていない。

以下の作業は管理者権限で実施する。

step1: /etc/auto.masterを編集する

  • root権限でエディタで/etc/auto.masterを開き、以下の行がコメントアウトされていればコメントアウトを外す。
/net    -hosts

step2: autofsサービスを有効化して起動する

systemctl enable --now autofs

step3: 確認

ls /net/fs09/

work01, work02などが見えればok。fs09以外にも、研究室内でNFSエクスポートをかけてあるリモートファイルシステムはすべてアクセス可能になる。

step4: ホームディレクトリのリンクを張る

研究室計算機のアカウントはホームディレクトリを /home/people/<アカウント名> としていて、その実体は /net/fs09/homes/people/<アカウント名> にある(2020/4/28現在)ので、以下の様にシンボリックリンクを張る。

cd /home
ln -s /net/fs09/homes/people .

ユーザー管理関連

LDAPユーザーの追加方法

まずLDAPサーバーにrootログインする。

> ssh root@ldap
> ls

rootのホームディレクトリでlsすると *.ldif ファイルがごろごろ転がっているはずで、これがLDAPのユーザー登録に用いるファイル群である。

LDAPユーザーにはUIDを通しでつけているから、現状のUIDの使用状況を確認する。ユーザーは12000番台を割り当てているので、以下で一覧を表示する。

> ldapsearch -x -L -b "dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp" | grep 'uidNumber: 12' | sort | tail

例えば以下の様に表示されたならば、

uidNumber: 12117
uidNumber: 12118
uidNumber: 12119
uidNumber: 12120
uidNumber: 12121
uidNumber: 12122
uidNumber: 12123
uidNumber: 12124
uidNumber: 12125
uidNumber: 12126

新規ユーザーはUID 12127 として登録すればよい。

次にユーザーのパスワードを用意し、ハッシュ値を作成する。

> slappasswd
New password:
Re-enter new password:

研究室の既存のドキュメントでは「ユーザーパスワードは大文字、小文字、数字、記号を含む12桁で設定」と書いてあるが、これが研究室での規約ということなのか、そうでないとシステムが受け付けないということなのか、よくわからない。気になったらだれか調べてください。いまのところ調べるのが面倒なため何も考えずに従っています。

以下のようなハッシュ値が表示されるから、それを控えておく。

{SSHA}PZfbmb0GBrR+YNoWNqtQl5JXWrPSKsZJ

で、ldifファイルのテンプレートをコピーして新規追加ユーザー用のldifファイルを用意する。

コピーの時に間違って他のldifを上書きしたりしないように注意。

新しいユーザーはフルネームが Shiroh EMIYA, ユーザー名が shiroh であるものとして説明する。

> cp template.ldif 2020_shiroh.ldif

2020と書いたのは2020年度に追加したユーザーであることを明らかとするため。

で、2020_shiroh.ldif を開くと以下の様になっているんで、

dn: cn=<Firstname> <LASTNAME>,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp
cn: <Firstname> <LASTNAME>
gidnumber: 1001
homedirectory: /home/people/<username>
loginshell: /bin/bash
objectclass: account
objectclass: posixAccount
uid: <username>
uidnumber: <uidnumber>
userpassword: <a password encripted with slappasswd>

<...>の部分を適宜置き換えればよい。

例えば、

dn: cn=Shiroh EMIYA,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp
cn: Shiroh EMIYA
gidnumber: 1001
homedirectory: /home/people/shiroh
loginshell: /bin/bash
objectclass: account
objectclass: posixAccount
uid: shiroh
uidnumber: 12127
userpassword: {SSHA}PZfbmb0GBrR+YNoWNqtQl5JXWrPSKsZJ

で、ldapaddコマンドでLDAPへ登録する。

> ldapadd –x –D "cn=Manager, dc=yasunaga-lab, dc=bio, dc=kyutech, dc=ac, dc=jp" –W –f 2020_shiroh.ldif

LDAP管理パスワードを聞かれるけど、知らなければネットワーク係に問い合わせてください。

成功すれば以下のようなメッセージだけが表示される。

adding new entry "cn=Shiroh EMIYA,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp"

で、ホームディレクトリ作成する。ホームディレクトリは/net/fs09/homes/people/に置いてあるので、そこに新規ユーザー名と同じディレクトリを作成する。パーミッションもちゃんとアレしてください

> cd /net/fs09/homes/people
> mkdir shiroh
> chown 12127:1001 shiroh

で、LDAPクライアントを有効化しているどっかの計算機にログインして、ユーザーとホームディレクトリが有効になっているかどうかチェックしてください。

> ssh shiroh@cs05

完全なる虚無のホームディレクトリを作ったためシェルがすっぴん状態ですから、ほかの人のbashrcとかを見て適当によろしくやってください。もしくはだれかやる気のある人が、ホームディレクトリのテンプレート的なものを作成してください。

LDAPでユーザー管理していない計算機にアカウントを追加する

<前提>

  • LDAPサーバーに研究室アカウントを登録済みであること
  • アカウントを追加したい計算機で管理者権限を使えること
  • アカウントを追加したい計算機でautofsが有効になっており、LDAPアカウントのホームディレクトリにアクセス可能なこと

<想定状況>

  • LDAPでユーザー管理していない計算機(rc, DL-Boxなど)において、LDAPに登録してあるユーザー所有のファイルやディレクトリに同じ権限でアクセスできるようなアカウントを作りたい。ホームディレクトリも共有したい。
    • LDAPを有効化しようにも既存ユーザーとLDAPユーザー名やグループ名などがバッティングしていてLDAP有効化できない場合とか、宗教上の理由によりその計算機でLDAPを使いたくない場合など。

step1: LDAPユーザーのUIDとGIDを確認する

LDAPでユーザー管理している計算機上で、idコマンドにより確認する。

例えばユーザー名がkttnである場合、

[13:36:52 kttn@cs05 ~]
> id kttn
uid=12118(kttn) gid=1001(yasunaga-lab) groups=1001(yasunaga-lab),10(wheel)

※ cs06ではgid=1001はLDAP有効化以前の既存グループwcsに持っていかれているので、yasunaga-labではなくwcsと表示される。

上記より、UIDは12118, GIDは1001であると確認できる。Linuxではユーザー識別にユーザー名とグループ名は関係なくて、UIDとGIDが同じであるか否かでユーザー識別がされる。したがって、UIDとGIDが上記で確認したLDAPユーザーのそれらと同じアカウントを作りさえすれば目的は達成できる。

step2: 既存アカウントおよびグループの確認

ユーザー名 kttn, uid 12118, グループ名 yasunaga-lab, gid 1001 でアカウントを追加したいものとして説明する。

アカウントを追加したい計算機にログインし、まず同じユーザー名をもつユーザーが存在しないか調べる。

[kttn@rc ~]$ id -u kttn
1007

遺憾ながらすでにkttnという名前のアカウントを作ってしまっていて、同じアカウント名を使えないため、ユーザー名はkttn2として作ることにする。

同様にグループ名を調べる。

[kttn@rc ~]$ id -g yasunaga-lab
id: yasunaga-lab: no such user

yasunaga-labという名前の既存グループは存在しないため、yasunaga-labという名前のグループを新たに作成しても良い。

次に同じUIDを持つユーザーが存在しないか調べる。

[kttn@rc ~]$ id -un 12118
id: 12118: no such user

存在しない。

同様にGID

[kttn@rc ~]$ id -gn 1001
wcs

残念ながらwcsというグループがすでにGID 1001を割り当てられている。yasunaga-labというグループは作らずに、wcsというグループでアカウントを作ることにする。

まとめると、ユーザー名 kttn2 (uid=12118), 所属グループ wcs (gid=1001) でアカウントを作成することにする。

step3: アカウント作成

管理者権限で実施。

[root@rc ~]# useradd --home-dir /home/people/kttn --gid 1001 --groups wheel --no-create-home --shell /usr/bin/bash --uid 12118 kttn2

--shellはLDAPユーザーのそれと同じにする。--shellのパスはOSによって違うかもしれないが、centos7の場合bashは/usr/bin/bashである。

--groupsは追加のグループを指定していて、centos7ではwheelを追加するとsudoコマンド使用が可能になる。

--home-dirは、LDAPユーザーで使っているホームディレクトリを指定すること!

次にパスワードの設定。

[root@rc ~]# passwd kttn2
Changing password for user kttn2.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

LDAPユーザーのそれと同じにしとくが吉。

step4: 確認

suコマンドで追加したユーザーになってみる。

[root@rc ~]# su kttn2   
[14:32:31 kttn2@rc /root] 
> cd

[14:32:31 kttn2@rc ~]
> ls
ビデオ        デスクトップ  docker     pyenv-init.sh  scripts            tmp   画像
ダウンロード  ドキュメント  Downloads  R              softwares          web   音楽
テンプレート  Desktop       perl5      repos          thinclient_drives  公開

問題なくホームディレクトリが見れている。あとは念のためファイル作れるかとか消せるかとかをチェックすればよい。

もちろん外側からsshするときは新たに作成したユーザー名で、

ssh kttn2@rc

とかやる。

ウェブサーバー関連

特定のIPアドレスをアクセス禁止にする

Scientific Linux 6の場合。

ターミナルでログインし、/etc/sysconfig/iptables をroot権限で開き、以下の書式でIPを追記する。

-A INPUT -s <IP address>/<subnet bit数> -p tcp -j REJECT

例えば192.0.2.xxx からのアクセスを禁止するには、192.0.2.0/24 と書く。udpアクセスを禁止する場合はtcpの代わりにudpと書く。

上記を編集した後、以下によりiptablesをリロードして設定を反映させる。

service iptables restart

iptablesを再起動すると、ごくわずかな時間だがiptablesによるアクセス管理が無効になるようで、その間アクセスが多くなったりする。

ロケール

CentOS7

以下コマンドでロケールを指定し、設定を反映させる。

sudo localectl set-locale LANG=ja_JP.UTF-8
source /etc/locale.conf

簡単にウェブを探しても、システム全体でこれを永続させるような方法が見当たらず。システムの環境変数としてLANG=ja_JP.UTF-8を指定すればいいような気もするが...

ユーザーの.bash_profileに、以下を追記する。

LANG=ja_JP.UTF-8
export LANG

ログイン直後はロケール設定失敗みたいなエラーが出てくるかもしれないが、それを除けば日本語コンソール環境みたいになる。

CentOS7 Docker

Dockerの場合はlocalectfを使用できないので、以下コマンドを使う。nvidia/cudaのcentos7イメージの場合はこれだけでいける、はず。

sudo localedef -f UTF-8 -i ja_JP ja_JP.UTF-8

Ubuntu 18.04 Docker

以下でokだった。

sudo apt install language-pack-ja-base

BASH

ディレクトリスタック

複数のディレクトリパスをディレクトリスタックに記憶しておき、ディレクトリ移動を楽にする仕組み。

  • ディレクトリを移動するとともに、ディレクトリスタックに追加するコマンド
pushd <行先ディレクトリ>
  • 現在のディレクトリスタックの表示
dirs -v

1カラム目がディレクトリスタックにおけるそのディレクトリの識別番号。

  • ディレクトリスタックの中の特定のディレクトリへ移動
# 識別番号を確認
dirs -v
# 移動(+記号を忘れずに)
pushd +<識別番号>