はじめてUNIX で仕事をする人が読む本 の備忘録 06
お世話になった本
この連載ブログを書くにあたり、お世話になった本がこちら。LPICと被っているところもありますが、実務での使い方なんかも扱っており、良書だと思います。
- 作者: 木本雅彦,松山直道,稲島大輔
- 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
- 発売日: 2014/03/25
- メディア: Kindle版
- この商品を含むブログ (5件) を見る
第6章 セキュリティ
UNIX におけるセキュリティ
ユーザの権限の分離がキーワード。
アクセス制限できる項目は以下の通り
ACL (Access Control List) は、getfacl
、setfacl
等のマニュアル参照。
ルート権限の獲得方法
通常一般ユーザでログインする。SSH でリモートログインする場合、ルートユーザでのログインが禁止されている運用がほとんど。なので、ログインしてからルートユーザに切り替える。コマンドは、su
コマンド。ルートユーザの権限でコマンドを実行したいときは、sudo
でを使う。
su コマンド
su (Substitute User)
コマンド。任意のユーザ権限でシェルを実行するコマンド。引数が省略された場合は、ルート権限でルートのシェルを実行。引数に-
を与えると、元ユーザの環境(環境変数やカレントディレクトリなど)を引き継がない。
[user@pc ~]$ cd /tmp/ [user@pc tmp]$ pwd /tmp [user@pc tmp]$ su <= 環境を引き継ぐ パスワード: [root@pc tmp]# exit exit [user@pc tmp]$ su - <= 環境を引き継がない パスワード: [root@pc ~]#
sudo コマンド
個人的な見解としては、こちらをよく使う。一般ユーザでログインしておきコマンドを実行するときに必要に応じて、コマンドの前にsudo
コマンドを書いてあげる。su
権限でコマンドを実行することが出来る。
設定はsudoers
ファイルに記述されている。visudo
コマンドで編集できる。visudo
コマンドは排他制御される。直接いじるよりこのコマンドを使うほうが良さそう。
sudo -l <user name>
でコマンドを実行するユーザを指定できる。
user@pc:~$ sudo bash [sudo] password for user: root@pc:~#
共通鍵暗号と公開鍵暗号
データ本体のセキュリティについて。大きく分けて、共通鍵暗号方式と公開鍵暗号方式がある。
共通鍵暗号は、暗号化と復号化が同じ鍵(共通鍵)を使う。一般的なパスワードの暗号化はこの方式を使う。アルゴリズムは、DES
、3DES
、AES
など。
インターネットを経由する通信では、共通鍵をどのように一致させるか問題がある。このため、公開鍵暗号方式が生まれた。アルゴリズムはRSA
などがある。
基本的な考え方。
公開鍵暗号方式は、ユーザ一人につき「公開鍵」と「秘密鍵」のペアを持つ。公開鍵は文字通り、インターネットに公開される。秘密鍵はバレちゃダメ。
「秘密鍵」で暗号化されたファイルは、「公開鍵」で復号化出来る。「公開鍵」で暗号化されたファイルは、「秘密鍵」で復号化出来る。
これにより、共通で同じ鍵を持つ必要がなくなる。
もし、Aさんが、Bさんに暗号化されたファイルを送りたければ、Bさんの「公開鍵」を使って暗号化し、Bさんに送信する。Bさんは、自分の「秘密鍵」で復号化したら良いわけだ。
これで、ファイルの完全性が証明される。
さらに、Aさんが送ったことを保証したければ、Bさんの「公開鍵」で暗号化したものを、更にAさんの「秘密鍵」で暗号化する。Bさんは、Aさんの「公開鍵」で復号化し、Bさんの「秘密鍵」で復号化する。これで、Aさんから送られたことを保証できる。これを電子署名という。
SSH の応用
SSH 公開鍵認証
公開鍵と秘密鍵のペアを作成する方法
コマンド、ssh-keygen
を用いる。rsa
を用いるときは、ssh-keygen -t rsa
で良い。
コマンドを実行すると、ホームディレクトリ配下に、.ssh
ディレクトリができているはず。その配下に、id_rsa
とid_rsa.pub
ファイルが出来上がる。
id_rsa
- 秘密鍵
- 他人に盗まれちゃダメ。
- 他人に盗まれたら、削除して新しい鍵を作ろう
id_rsa.pub
- 公開鍵
- おそらく、
pub
はpublic
の前3文字だと思う。
公開鍵を接続先サーバの管理者に渡して、追加してもらえばOK。
手元で仮想マシンなどで試す場合は、以下の通りauthorized_keys
ファイルを作りその中にid_rsa.pub
ファイルの中身をコピーする。
# まず、ユーザのホームディレクトリに行きます。 $ cd ユーザのホームディレクトリ $ mkdir .ssh $ sudo chmod 700 .ssh # もし、既にユーザのホームディレクトリ配下にid_rsa.pub ファイルがある場合 $ cat id_rsa.pub >> .ssh/authorized_keys
他にも、id_rsa.pub
の中身を開いてマウスで選択してコピーして、.ssh/authorized_keys
に貼り付けでもいいんですけどね。
ssh-agent
あまりつかったこと無い。
(なぜなら、基本的にパスフレーズを0文字にしているからな!)
毎回長いパスフレーズを入力するのが煩わしい時にこれを使う。最初に一度だけパスフレーズを入力すると、ssh
コマンド実行時のパスフレーズ入力を省略できる。
$ eval `ssh-agent` $ ssh-add
ssh-agent
を起動。すると、環境情報が出力される。eval
で環境変数化。シェルの種類は、ssh-agent
により自動判別。
ssh-add
コマンドを実行する。パスフレーズが求められ、入力して登録完了。シェルをexit
するまでパスフレーズの入力が必要なくなる。
Ubuntu デスクトップでは、ssh-agent
が最初から起動している。ssh-add
するだけでよい。
scp
SSHによる通信経路を使い、ファイルをコピーできる。
リモートファイルを手元にコピーする場合
$ scp <hostname or IP address>:<path> <手元のpath>
手元のファイルをリモート側にコピーする場合
$ scp <手元のpath> <hostname or IP address>:<path>
-r
オプションでディレクトリごとコピーできる。詳細は、man
を見てね。
ssh_config設定ファイル
とりあえず、man 5 ssh_config
でマニュアルを確認できる。
~/.ssh/config
ファイルを作成し、各種設定ができる。
- Host
- 別名を付けれる。
- 次にHost の項目を見つけるまでは、当該ホストの設定
- HostName
- 接続先ホスト名を指定する
- User
- ユーザ名を指定する
- Port
- 接続先SSHサーバのポート番号を指定する
例
Host apple HostName apple.example.co.jp User pen Port 2222
SSH によるポート転送
ポートフォワーディングの話。(セキュリティとは少し離れる)
SSHで暗号化された通信路に、別の接続をのせることができる。これをSSHポートフォワーディングまたは、SSHトンネルなどと呼ぶ。
使いどころ
踏み台サーバにログインしたあと本番サーバにログインするときなど
踏み台サーバ:jump.example.net
接続先サーバ : pen.example.net
目指す動作:jump.example.net にアクセスしたあと、pen.example.net にアクセスする。
$ ssh -L8000 pen.example.net:80 jump.example.net
-L
オプションがリモートへのポート転送オプション
ローカルホストの8000番ポートに接続するとjump.example.net を経由して、pen.example.net:80 に中継されるらしい。
PGP による暗号化、電子署名
PGP (Pretty Good Privacy)
詳細は割愛する。必要なときにまた調べましょう。
以上で、第6章 セキュリティの話は終わりです。
次回から、第7章 Unix システム管理 です。