インターネットソフトウェア(3日目) セキュリティ演習(OS&サーバー編)

【目次】

演習用仮想マシンの利用について

  • 今回の講義のために、受講生1人につき演習用VM(Virtual Machine)を1つ用意しています。
  • 演習用VMの仕様は下記の通りです。
  • OS(Linuxディストリビューション): CentOS7
  • CPU: 1core
  • Memory: 1GB
  • HDD: 4GB
  • 受講生ごとに割り当てる演習用VMは、下記の通りです。
No.学籍番号ホスト名(FQDN)IPv4アドレス
1125761His2017-1.st.ie.u-ryukyu.ac.jp10.0.6.1
2135753Bis2017-2.st.ie.u-ryukyu.ac.jp10.0.6.2
3135771Kis2017-3.st.ie.u-ryukyu.ac.jp10.0.6.3
4135772His2017-4.st.ie.u-ryukyu.ac.jp10.0.6.4
5145165Bis2017-5.st.ie.u-ryukyu.ac.jp10.0.6.5
6145702Bis2017-6.st.ie.u-ryukyu.ac.jp10.0.6.6
7145705Fis2017-7.st.ie.u-ryukyu.ac.jp10.0.6.7
8145707Bis2017-8.st.ie.u-ryukyu.ac.jp10.0.6.8
9145723Dis2017-9.st.ie.u-ryukyu.ac.jp10.0.6.9
10145724Bis2017-10.st.ie.u-ryukyu.ac.jp10.0.6.10
11145726Jis2017-11.st.ie.u-ryukyu.ac.jp10.0.6.11
12145741Bis2017-12.st.ie.u-ryukyu.ac.jp10.0.6.12
13145760Jis2017-13.st.ie.u-ryukyu.ac.jp10.0.6.13
14155701His2017-14.st.ie.u-ryukyu.ac.jp10.0.6.14
15155702Fis2017-15.st.ie.u-ryukyu.ac.jp10.0.6.15
16155703Dis2017-16.st.ie.u-ryukyu.ac.jp10.0.6.16
17155712Cis2017-17.st.ie.u-ryukyu.ac.jp10.0.6.17
18155719Ais2017-18.st.ie.u-ryukyu.ac.jp10.0.6.18
19155723Jis2017-19.st.ie.u-ryukyu.ac.jp10.0.6.19
20155728Kis2017-20.st.ie.u-ryukyu.ac.jp10.0.6.20
21155738Gis2017-21.st.ie.u-ryukyu.ac.jp10.0.6.21
22155743Cis2017-22.st.ie.u-ryukyu.ac.jp10.0.6.22
23155765Dis2017-23.st.ie.u-ryukyu.ac.jp10.0.6.23
24165711Kis2017-24.st.ie.u-ryukyu.ac.jp10.0.6.24
25165714Dis2017-25.st.ie.u-ryukyu.ac.jp10.0.6.25
26165719Eis2017-26.st.ie.u-ryukyu.ac.jp10.0.6.26
27165721Gis2017-27.st.ie.u-ryukyu.ac.jp10.0.6.27
28165726His2017-28.st.ie.u-ryukyu.ac.jp10.0.6.28
29165730Fis2017-29.st.ie.u-ryukyu.ac.jp10.0.6.29
30165734Jis2017-30.st.ie.u-ryukyu.ac.jp10.0.6.30
31165741Bis2017-31.st.ie.u-ryukyu.ac.jp10.0.6.31
32165748Jis2017-32.st.ie.u-ryukyu.ac.jp10.0.6.32
33165754Cis2017-33.st.ie.u-ryukyu.ac.jp10.0.6.33
34165759Dis2017-34.st.ie.u-ryukyu.ac.jp10.0.6.34
  • CentOS7に追加したパッケージ(この講義に関係あるもの)
  • サーバー系
  • httpd *HTTPサーバー(Apache)
  • dovecot *POP3/IMAPサーバー
  • bind *DNSサーバー
  • xinetd *インターネットスーパーサーバー
  • ツール・コマンド系
  • nmap *ポートスキャンツール
  • tcpdump *パケットキャプチャツール
  • wireshark *パケットキャプチャツール
  • net-tools *ifconfigなどの旧形式のネットワーク管理コマンド群
  • bind-utils *hostコマンドなどのDNS(bind)クライアントコマンド群
  • lsof *lsofコマンド
  • 上記の追加パッケージは、以下のコマンドでインストールしました。
# yum install (パッケージ名)
(例)
# yum install nmap
  • 起動サービスについて
  • CentOS7の初期インストール後に、下記のコマンドを実行して、httpd(apache)、smtp(postfix)、pop3&imap(dovecot)、named(bind)、xinetdサービスを有効化し、OS起動時に自動起動するようにしています。
# systemctl start httpd.service
# systemctl start postfix.service
# systemctl start dovecot.service
# systemctl start named.service
# systemctl start xinetd.service

# systemctl enable httpd.service
# systemctl enable postfix.service
# systemctl enable dovecot.service
# systemctl enable named.service
# systemctl enable xinetd.service
  • 管理者アカウント"root"について
  • 演習用VMには管理者アカウント"root"があります。
  • "root"アカウントのパスワードは、講義中に示します。
  • "root"アカウントのパスワードは、下記のコマンドを実行して、速やかに変更して下さい。
# passwd
  • 変更するパスワードは、半角の英文字(大文字)・英文字(小文字)・英数字・記号が全て含まれた8文字以上の文字列にして下さい。(パスワード例: 5SPsh0s&)
  • 講師用アカウント"auser"について
  • 演習用VMには講師用アカウント"auser"があります。
  • "auser"アカウントのパスワードは非公開です。勝手にパスワードを変更しないこと。
  • "auser"アカウントは、講師(長田)が各自の演習用VMにアクセスするためのユーザーです。
  • ユーザーの作成について
  • 下記のコマンドを実行して、ユーザーを作成して下さい。
  • 作成するユーザーのユーザー名(ユーザーID)は、各自の学科システムアカウントと同じものとします。(例: e165700)
# useradd (ユーザーID)
(例)
# useradd e165700
  • 次に、下記のコマンドを実行して、作成したユーザーのパスワードを設定して下さい。
# passwd (ユーザーID)
(例)
# passwd e165700
  • CentOS7のアップデートについて
  • CentOS7の初期インストール後に、下記のコマンドを実行してアップデートしています。
# yum -y update
  • 講義開始時点で最新アップデートがリリースされている可能性があるため、"root"アカウントでログイン後に、上記のコマンドを実行してアップデートして下さい。
  • その他
  • CentOS7にデフォルトで設定されているyumリポジトリ以外に、"EPEL"リポジトリを追加しています。
  • ここまでの作業を全て行ったら、下記のコマンドを実行してOSを再起動して下さい。
# reboot

基本的なセキュリティ設定

不要サービスの停止とファイアウォールの設定

  • OSが起動して"root"アカウントでログインしたら、下記のコマンドを実行して、現在オープンしているポートを確認します。
# netstat -l
または、
# netstat -ln (ポート番号からサービス名の変換を行わない)
  • 実行結果は下記の通りとなり、"pop3(tcp:110)","imap(tcp:143)","domain(tcp&udp:53)","ssh(tcp:22)","rndc(tcp&udp:953)","smtp(tcp:25)","imaps(tcp:993)","pop3s(tcp995)",その他いくつかのudpポートがオープンしていることが分かります。
  • また、演習用VMはIPv4, IPv6の両方に対応しているため、TCP/IPv4, TCP/IPv6の両方のポートがオープンしていることが分かります。
[root@localhost ~]# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:pop3            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:imap            0.0.0.0:*               LISTEN
tcp        0      0 localhost:domain        0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 localhost:rndc          0.0.0.0:*               LISTEN
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:imaps           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:pop3s           0.0.0.0:*               LISTEN
tcp6       0      0 [::]:pop3               [::]:*                  LISTEN
tcp6       0      0 [::]:imap               [::]:*                  LISTEN
tcp6       0      0 [::]:http               [::]:*                  LISTEN
tcp6       0      0 localhost:domain        [::]:*                  LISTEN
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN
tcp6       0      0 localhost:rndc          [::]:*                  LISTEN
tcp6       0      0 localhost:smtp          [::]:*                  LISTEN
tcp6       0      0 [::]:imaps              [::]:*                  LISTEN
tcp6       0      0 [::]:pop3s              [::]:*                  LISTEN
udp        0      0 localhost:323           0.0.0.0:*
udp        0      0 localhost:domain        0.0.0.0:*
udp        0      0 0.0.0.0:bootpc          0.0.0.0:*
udp        0      0 0.0.0.0:13984           0.0.0.0:*
udp6       0      0 [::]:50913              [::]:*
udp6       0      0 localhost:323           [::]:*
udp6       0      0 localhost:domain        [::]:*
  • ここで、上記のオープンしているポートが、どのプログラムから使用されているかを調べます。
  • 例えば、pop3(tcp:110)を使用しているプログラムを調べる場合は、下記のコマンドを実行します。
# lsof -i:110

実行結果は下記の通りとなり、dovecotプロセスがポート(tcp:110)を使用していることが分かります。

[root@localhost ~]# lsof -i :110
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dovecot 13982 root   23u  IPv4  84492      0t0  TCP *:pop3 (LISTEN)
dovecot 13982 root   24u  IPv6  84493      0t0  TCP *:pop3 (LISTEN)
  • ここで、オープンしているポート(サービス)が、必要であるかどうかを検討します。
  • もし、不要なポート(サービス)がオープンしているのであれば、そのポートはクローズする必要があります。
  • ポートをクローズする方法は、下記の2つがあります。
  • ポートを使用しているプロセスを停止する。
  • ファイアウォールを設定して、そのポートにアクセスできなくする。
  • まず、前者の方法は、下記のコマンドを実行してプロセスを停止するとともに、OS起動時に自動起動しないようにします。
# systemctl stop dovecot.service
# systemctl disable dovecot.service
  • ただし、上記の方法では、dovecotプロセスが提供しているpop3以外のサービス(pop3s,imap,imaps)も停止してしまいます。
  • 次に、後者の方法は、CentOS7のファイアウォール機能を利用します。
  • まず、下記のコマンドを実行して、ファイアウォール機能が有効な状態であるか確認します。
# systemctl status firewalld
  • 下記の結果が返ってくれば、ファイアウォール機能は有効です。
Active: active (running)
  • 下記のコマンドを実行して、ファイアウォールの設定が適用されるゾーンを確認します。
[root@localhost ~]# firewall-cmd --get-active-zones
public
  interfaces: eth0
  • 上記の結果より、"public"ゾーンが定義されており、"public"ゾーンの対象インタフェースは"eth0"であることが分かります。
  • 下記のコマンドを実行して、"pubclic"ゾーンに定義されているサービスを確認します。
[root@localhost ~]# firewall-cmd --list-services --zone=public
http dns pop3s imaps pop3 ssh https imap
  • 上記の結果より、表示された各サービスが公開されている(外部からアクセス可能)ことが分かります。
  • ここで、下記のコマンドを実行して、外部からのpop3サービスアクセスを拒否してみます。(注意:"ssh"を拒否するとVMにsshアクセスできなくなるので、sshは拒否しないこと)
# firewall-cmd --remove-service=pop3 --zone=public
  • 下記のコマンドを実行して、設定を有効化します。
# firewall-cmd --reload
  • 再び下記のコマンドを実行して、表示結果から"pop3"がなくなっていればok。
[root@localhost ~]# firewall-cmd --list-services --zone=public
http dns pop3s imaps ssh https imap
  • 上記で設定したファイアウォール設定をOS再起動後も有効にしたい場合は、下記の通り、firewall-cmdに--permanentオプションをつけてを実行します。
# firewall-cmd --permanent --add-service=(サービス名) --zone=public
# firewall-cmd --permanent --remove-service=(サービス名) --zone=public
  • さらに、特定のソースアドレスからのアクセスを拒否するには、下記の通りコマンドを実行します。
# firewall-cmd --zone=drop --add-source=192.168.0.0/24
  • この他に、ファイアウォール機能を利用することで、ゾーンごとに特定のソースアドレスから、特定のサービスへのアクセスを制限するなど、様々なアクセス制限を行うことができます。

サービスごとのセキュリティ設定

その前に、sudoers設定

  • Linuxでは、一般ユーザーが管理者(root)権限でコマンド実行を行えるようにするための"sudo"コマンドがあります。
  • 通常のOSのオペレーションでは、一般ユーザーでログインし、管理者権限でコマンドを実行する必要があるときのみ、必要に応じてsudoコマンドでコマンド実行します。
  • 例えば、rootユーザーしか開けないファイルを一般ユーザーが開くには、下記の通り、実行したいコマンドの前にsudoコマンドを付けて実行します。
# sudo vi hogehoge.txt
  • sudoコマンドを実行できる一般ユーザーは、/etc/sudoersで設定する必要があります。
  • 例えば、"e165700"ユーザーに、管理者(root)権限で全てのコマンドを実行できるようにするには、/etc/sudoersに次の設定を加えます。
e165700  ALL=(ALL)       ALL
  • この他に、/etc/sudoersの設定によって、特定のユーザーが管理者権限で実行を許可するコマンドを指定(限定)したり、グループ単位で制限をすることができます。

SSH

  • ssh(Secure SHell)は、Linuxにシェルログインするための仕組みで、sshサーバーとsshクライアントで構成されます。
  • CentOS7では初期インストール後は、SSHサーバーが自動起動するようになっており、外部からsshアクセスできるようになっています。
  • しかし、SSHサーバーのデフォルト設定では、下記のようなセキュリティ上好ましくない設定があります。
  1. rootユーザーでアクセスができる。
  2. パスワード無しユーザーがアクセスできる。
  3. 鍵認証のみでアクセスできるようになっていない(パスワード認証ができる)。(※)
  4. アクセスできるユーザーが制限されていない。(※)
  • /etc/ssh/sshd_config を下記の通り修正することで、上記の問題を解決できます。
(i変更前)          
PermitRootLogin yes
(i変更後)
PermitRootLogin no
又は
PermitRootLogin without-password

(ii変更前)
PermitEmptyPasswords yes
(ii変更後)
PermitEmptyPasswords no

(iii変更前)
PasswordAuthentication yes
(iii変更後)
PasswordAuthentication no

(iv変更前)
なし
(iv変更後)
AllowUsers (アクセスを許可するユーザーID)
  • ここで、iiiについて、鍵認証は、公開鍵暗号方式で行う認証のことです。
  • 公開鍵暗号方式での認証を行うには、秘密鍵と公開鍵の2種類のペア鍵が必要です。(ペア鍵の作成方法は、講義中に実演しながら説明します)
  • 鍵ペアの作成方法には、下記の2つのパターンがあります。
  • サーバー側又はクライアント側の一方で鍵ペアを作成し、もう一方に作成した秘密鍵を登録するケース (※)
  • サーバー側及びクライアント側の両方で鍵ペアを作成し、サーバー側にクライアントの公開鍵を登録するケース
  • これで、クライアントからサーバーに、鍵認証でsshアクセスできるようになります。

HTTP(Apache)

  • 講義時間によって取り扱いを判断します。

SMTP(Postfix)

  • 講義時間によって取り扱いを判断します。

POP3/IMAP(Dovecot)

  • 講義時間によって取り扱いを判断します。

DNS(Bind)

  • 講義時間によって取り扱いを判断します。

TCP Wrappers

  • 講義時間によって取り扱いを判断します。

xinetd

  • 講義時間によって取り扱いを判断します。
[ Back ]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-23 (水) 05:34:28 (399d)