「Linux関連」の版間の差分
(→SSH) |
(→ポート開放) |
||
行91: | 行91: | ||
> firewall-cmd --zone=public --add-port=2377/tcp | > firewall-cmd --zone=public --add-port=2377/tcp | ||
> firewall-cmd --reload | > firewall-cmd --reload | ||
+ | </pre> | ||
+ | |||
+ | 上記だけでは設定は永続化されない(再起動すると元に戻る)ので、永続化させるには以下の様に --add-port するコマンドに --permanent オプションを付ける。 | ||
+ | <pre> | ||
+ | > firewall-cmd --zone=public --add-port=2377/tcp --permanent | ||
</pre> | </pre> | ||
2020年11月17日 (火) 11:05時点における最新版
ネットワーク関連
ネットワーク系ツールのインストール
Ubuntu 16.04
> sudo apt install iputils-ping net-tools
ポートスキャン
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が動作しているかの確認
Ubuntu 16.04
firewallの制御はufw (ubuntu firewall)を使う。
> sudo ufw status
CentOS 7
firewallの制御はfirewall-cmdを使う。
> sudo firewall-cmd --state
firewallのゾーンについて
Windowsでパブリックネットワークやプライベートネットワークなど、セキュリティポリシーの異なるネットワーク設定が用意されているのと同じように、Linuxのfirewallでもゾーンと呼ばれるそのような区分けが存在する。ゾーンごとで通信を許可するプロトコルやポートを変えることができる。
存在するゾーンは以下コマンドでリストアップする。
> sudo firewall-cmd --list-all-zones
アクティブになっている(使用されている)ゾーン名の横には active とカッコ書きで表示され、interfaces: の項目に、そのゾーン設定のもとで運用されているネットワークインターフェースが列挙される。
... public (active) target: default icmp-block-inversion: no interfaces: eno1 ...
ポート、サービスの開放状態の確認
firewall-cmdの--list-allオプションで、デフォルトゾーン(たぶんpublic)の設定を確認できる。特定のゾーンの設定を見たければ --zone=<ゾーン名> をさらに付け加えればよい。
> 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:
上の出力例では、publicゾーンがDHCP, SNMP, SSHに応答できるよう設定してあるのがわかる。
ポート開放
参考:
firewall-cmdを使う。例えばpublicゾーンの2377番ポートをTCP用に開けるならば以下の様にする。
> firewall-cmd --zone=public --add-port=2377/tcp > firewall-cmd --reload
上記だけでは設定は永続化されない(再起動すると元に戻る)ので、永続化させるには以下の様に --add-port するコマンドに --permanent オプションを付ける。
> firewall-cmd --zone=public --add-port=2377/tcp --permanent
--add-portオプションを複数回指定して、一度に複数個のポート設定を追加することもできる。
特定のポートが使用中か否かのチェック
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である。Ubuntu16.04の場合は/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 +<識別番号>
SSH
リモートマシンでコマンドだけ実行する
リモートで実行したいコマンドをいつものsshコマンドの後ろに書くだけ。クォートは不要。
ssh user@host command