takashi kono's blog

コーヒーとキーボードと共に何かを記録していくブログ

はじめてUNIXで仕事をする人が読む本 の備忘録 06 セキュリティ

はじめてUNIX で仕事をする人が読む本 の備忘録 06

お世話になった本

この連載ブログを書くにあたり、お世話になった本がこちら。LPICと被っているところもありますが、実務での使い方なんかも扱っており、良書だと思います。

第6章 セキュリティ

UNIX におけるセキュリティ

ユーザの権限の分離がキーワード。

アクセス制限できる項目は以下の通り

  • ファイルの読み・書き・実行・ディレクトリの参照
  • (TCPUDPの) 特権ポートの利用

ACL (Access Control List) は、getfaclsetfacl等のマニュアル参照。

ルート権限の獲得方法

通常一般ユーザでログインする。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:~# 

共通鍵暗号公開鍵暗号

データ本体のセキュリティについて。大きく分けて、共通鍵暗号方式と公開鍵暗号方式がある。
共通鍵暗号は、暗号化と復号化が同じ鍵(共通鍵)を使う。一般的なパスワードの暗号化はこの方式を使う。アルゴリズムは、DES3DESAESなど。
インターネットを経由する通信では、共通鍵をどのように一致させるか問題がある。このため、公開鍵暗号方式が生まれた。アルゴリズムRSAなどがある。

基本的な考え方。
公開鍵暗号方式は、ユーザ一人につき「公開鍵」と「秘密鍵」のペアを持つ。公開鍵は文字通り、インターネットに公開される。秘密鍵はバレちゃダメ。
秘密鍵」で暗号化されたファイルは、「公開鍵」で復号化出来る。「公開鍵」で暗号化されたファイルは、「秘密鍵」で復号化出来る。
これにより、共通で同じ鍵を持つ必要がなくなる。

もし、Aさんが、Bさんに暗号化されたファイルを送りたければ、Bさんの「公開鍵」を使って暗号化し、Bさんに送信する。Bさんは、自分の「秘密鍵」で復号化したら良いわけだ。
これで、ファイルの完全性が証明される。
さらに、Aさんが送ったことを保証したければ、Bさんの「公開鍵」で暗号化したものを、更にAさんの「秘密鍵」で暗号化する。Bさんは、Aさんの「公開鍵」で復号化し、Bさんの「秘密鍵」で復号化する。これで、Aさんから送られたことを保証できる。これを電子署名という。

SSH の応用

SSH 公開鍵認証

  • 公開鍵を作成するとき、パスフレーズと呼ばれる文字列を使う
  • 通信時の認証に用いる公開鍵暗号方式
    • dsa
    • ecdsa
    • rsa
  • 接続先サーバで利用可能な方式を選ぶこと

公開鍵と秘密鍵のペアを作成する方法

コマンド、ssh-keygenを用いる。rsaを用いるときは、ssh-keygen -t rsaで良い。
コマンドを実行すると、ホームディレクトリ配下に、.sshディレクトリができているはず。その配下に、id_rsaid_rsa.pubファイルが出来上がる。

  • id_rsa
    • 秘密鍵
    • 他人に盗まれちゃダメ。
    • 他人に盗まれたら、削除して新しい鍵を作ろう
  • id_rsa.pub
    • 公開鍵
    • おそらく、pubpublicの前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 システム管理 です。