忍者ブログ

ぢみへんプログラミング日誌

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

サーバー構築超入門メモ(3):ファイアウォール再び

既にパケットフィルタで最低限セキュリティを保ってSSHだけは可能な状態でセットアップはしていたが、このままでは色々と問題がある。HTTP, HTTPSを遮断したままだし、他にも遮断したために、インターネットにアクセスする必要のある種々のコマンドが利用不能のはずである。
勿論そのままではアプリケーション開発どころではないので、必要になりそうなコマンドが使えるよう、ここではyumを例に、順を追ってファイアウォールを調整してみよう。

yum listと入力するとインストール済みのソフトウェアパッケージが一覧表示されるのだが、今の状況では最初にこういう出力が出てくる。
[root@ap]# yum list
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=x86_64 error was
14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrors.fedoraproject.org'"
* base: ftp.iij.ad.jp
* epel: epel.mirror.net.in
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
http://ftp.iij.ad.jp/pub/linux/centos/6/os/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'ftp.iij.ad.jp'"
Trying other mirror.
...
...
(以下延々とエラーが続く)

『Couldn't resolve host 'ftp.iij.ad.jp』、つまりリモートホストの参照ができないと言われているわけだ。これを裏付けるためにパケットフィルタのログを見てみる。(最初の時点からログが出るように仕込んであったのだ。どういう具合に設定したのかはこのシリーズの1回目を参照のこと)
Jun  5 20:09:11 <ホスト名> kernel: [output rejected]IN= OUT=eth0 SRC=xxx.xxx.xxx.xxx DST=zzz.zzz.zzz.zzz LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=58532 DF PROTO=UDP SPT=59673 DPT=53 LEN=53

/var/log/messagesの内容が上記だが、リモートホストへのUDPプロトコル53番ポートへの送信が遮断されている。UDPで53番ポートを使うのはDNSサービスであるから、なるほどホストの名前解決ができないのも納得だ。さっそくこの制限を外してみる。
[root@ap]# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Thu Jun 5 20:39:55 2014
*filter
:INPUT DROP [2:64]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1234 -m state --state NEW -j ACCEPT
-A INPUT -j LOG --log-prefix "[input rejected]"
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 下の1行を追加!
-A OUTPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT
-A OUTPUT -j LOG --log-prefix "[output rejected]"
COMMIT

設定追加後に再度yum --listとやってみると、今度は次のようなエラーが出た。
[root@ap]# service iptables restart
[root@ap]# yum list
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os error was
12: Timeout on http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os: (28, 'connect() timed out!')

エラーを見て察しがつく人もいると思うが、今度はhttpプロトコルが遮断されているためにcentos.orgと通信が通信ができてない。ログを見ても分かる。
Jun  5 20:42:53 <ホスト名> kernel: [output rejected]IN= OUT=eth0 SRC=<送信元MACアドレス> DST=2a02:2498:0001:003d:5054:00ff:fed3:e91a LEN=80 TC=0 HOPLIMIT=64 FLOWLBL=0 PROTO=TCP SPT=44504 DPT=80 WINDOW=14400 RES=0x00 SYN URGP=0

やはりTCPプロトコル80番ポートへの送信が遮断されている。
これも以下の行をiptablesファイルを編集し、OUTPUTルールの最後から2行目に挿入する。
-A OUTPUT -m tcp -p tcp --dport 80 -m state --state NEW -j ACCEPT
最後の行はそこよりも上の行のルールで引っかからなかったパケットを遮断する際のログ出力を指示しているので、必ずOUTPUTルールの最後にないといけない。これはINPUTやFORWARDでも同じことだ。

再びiptablesサービスを再起動してyumを実行する。
[root@ap]# yum list
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=x86_64 error was
12: Timeout on https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=x86_64: (28, 'connect() timed out!')
* base: ftp.tsukuba.wide.ad.jp
* epel: ftp.jaist.ac.jp
* extras: www.ftp.ne.jp
* updates: www.ftp.ne.jp

『Could not get metalink https://mirrors.fedoraproject.org』とエラーが出ているところを見ると、今度はhttpsプロトコルが遮断されているのが原因だろうと察しがつく。
Jun  5 21:01:25 <ホスト名> kernel: [output rejected]IN= OUT=eth0 SRC=<MACアドレス> DST=2001:4178:0002:1269:0000:0000:0000:fed2 LEN=80 TC=0 HOPLIMIT=64 FLOWLBL=0 PROTO=TCP SPT=43004 DPT=443 WINDOW=14400 RES=0x00 SYN URGP=0

ログには上記のエラーが数行あった。TCPでポート番号443はHTTPSだから、やはり見立ては合っている。そこでこれまでと同じやり方でHTTPSも許可してやろう。果たして今度はどうかと思いつつyum --listを実行した。
すると今度こそ、エラー表示なくyum が実行されたのだった。

というわけで、、、
ここまでにdns, http, https のファイアウォールを調整した。これで当面は問題ないはずだ。仮に問題が出てもまた今回のようにログを確認し、パケットが遮断されていればその内容を分析して必要なら通信を許可していけばよい。許可していいのか怪しいものに関しては識者に聞くなどして再度検討する。問題ないことがはっきりするまでは念のため当面はそのままにしておくのが良いだろう。
ここから先は過去にエントリしてきた記事の内容を頼りにruby, rails 等をインストールできるようになっているはず。超入門メモとしては十分な内容になったかな?少なくとも自分の備忘録としてはそれに近いと思うけど、読者の皆さんにも多少なりとも役立てば幸いです。
PR

サーバー構築超入門メモ(2):SSH公開鍵認証の設定

SSH(Open SSH)公開鍵認証を使えるようにする

前回はSSHデーモンの設定で、とりあえずパスワード認証を使えるようにしておいたが、本当は公開鍵認証に切り替えないといけない。
公開鍵認証というのは……あまり理屈は良く分かってないのだが(汗)どうやら秘密鍵と公開鍵の2つで認証する方式であるということは間違いない。(苦笑)
その2つの鍵を作るツールはいくつかあるので、慣れてる人はそれをそのまま使えばいいだろうし、そうでなければ本などを読んでそれに従えば大体間違いないと思っていいだろう。

ここでは筆者が今まで使った2つの方法を紹介する。

①ssh-keygen
LinuxOSを使っていて、sshdとsshの二つがインストールされていればこのコマンドも入っている(多分)。鍵を作る暗号アルゴリズムにはDSAとRSAというのがあるが、ここではDSAを使った例を紹介する。まずSSHを使ってログインさせたいユーザーででOSにログイン(この例では「hoge」というアカウントを使用)した後、自分のホームディレクトリで必要なコマンドを入力していく。
[hoge@ap] $ pwd
/home/hoge
[hoge@ap] $ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_dsa): [ここはエンターキーを押すだけ]

Enter passphrase (empty for no passphrase): [パスフレーズを入力]
Enter same passphrase again: [同じパスフレーズを入力]

(この後公開鍵と暗号鍵を生成した結果が表示される)

[hoge@ap] $ ls -aF
./ ../ .bash_history .bash_logout .bash_profile .bashrc .ssh/
[hoge@ap] $ ls -aF .ssh
./ ../ id_dsa id_dsa.pub
[hoge@ap] $ cd .ssh
[hoge@ap] $ cat id_dsa.pub >> authorized_keys
[hoge@ap] $ chmod 600 authorized_keys
[hoge@ap] $ cd ..
[hoge@ap] $ chmod 700 /home/biotopos/.ssh

ssh-keygenコマンドを使うことで.sshというディレクトリに id_dsa と id_dsa.pub という2つのファイルが生成される。これらはそれぞれ順に秘密鍵と公開鍵ファイルという扱いになる。
このうち公開鍵であるid_dsa.pubファイルを名前を「authorized_keys」に変えてコピーすると、OpenSSHがこのファイルを公開鍵として利用するようになる。

その後、各種SFTPツールを使って秘密鍵ファイル(id_dsa)をローカルホストにコピーしたら、それをteraterm等のコンソールツールに公開鍵認証時の秘密鍵として指定すればよい。

②puttygen
SFTPツールは各種あるが、いくつかのツールではputtyというコンソール端末ツールが使う形式の秘密鍵ファイルでないと受け付けないことがある。(例:WinSCP)
このため必要であればputtygen.exe をインターネットからダウンロードしてくる必要がある。
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

ツール自体の使い方は簡単で、ローカルホストで最初から秘密鍵と公開鍵の両方を作成したければ「generate」というボタンを押し、その後「Save plivate key」と「Save public key」のボタンをそれぞれ押して、ファイルに保存すればいい。
既にリモートホスト側(つまりサーバー側)で鍵自体は作成済みで、秘密鍵をローカルにダウンロード済みであれば「Load」ボタンを押してファイルを指定すれば、パスフレーズの入力を済ませたあとにputtyで使う形に変換してくれる(本当は名前だけ変えて中身は同じなんじゃ? 未確認だけど)。その後「Save private key」ボタンを押して、putty.ppk というファイルを作れば、以後それを秘密鍵ファイルとして使えるようになる。

パスワード認証を不可にする

前回sshdの設定で、パスワード認証を可能にしていたが、公開鍵認証ができるようになった後ではこの設定はただの脆弱性に過ぎない。このためパスワード認証は不可にする。sshd_configファイルを変更して保存したら、sshdを再起動すればよい。
[root@ap] vi /etc/ssh/sshd_config
....
....
PasswordAuthentication yes ←これをyes に変える
...


これ以後はrubyなりrailsなりをインストールしていけばよいのでサーバ構築の話はここでおしまい、としたいところだが、ファイアウォール(パケットフィルタ)の設定はまだhttpとhttpsの送信を許可していないのでyumやrubygemが動かない等、再度ファイアウォールの関係で問題が起きることが予想される。ということで、その辺は次回に。

参考文献・URL:
CentOS6で作るネットワークサーバ構築ガイド 秀和システム刊
Linuxサーバーセキュリティ オライリー刊

サーバー構築超入門メモ(1):ファイアウォールとSSHの用意

今回はサーバー構築の話です。

久々の更新ですが……みなさんいかがお過ごしでしょうか。
今回はサーバー構築の話です。
サーバー構築のネタは、Rails開発環境を作るという内容では過去数回やってきました。この2年ほど、いくつかRailsを使ったプロジェクトでWebアプリケーションを作る機会に恵まれた経験から言うと、やはり元々がLAMP型開発と言われていただけあって、ウェブアプリケーション開発者には仮想OSを用いた開発環境だけでなく本番稼働サーバーのことも視野に入れたノウハウが要求される機会が増えたと思います。昔はサーバー屋さんに任せていればよかったことも、ある程度のことは自分でできるか、頼むにしてもこちら側にある程度の知識がないと何をしてほしいのか説明するのも大変な時代になってきました。言い換えるならば、
「俺は開発者だからサーバーのセットアップなど関係ない」という時代はとっくの昔に終わっています。いや、終わっていた。(笑)
おそらく10年くらい前からそうなってきてたんでしょうが、個人的に経験しないと分からない性質なので最近になるまで分かりませんでした。例え本番サーバーでWebアプリケーションの環境を構築しなくても、これまでに見てきたようにWindows環境を使う開発者はVMWare等で仮想Linux環境を作らないことには仕事になりません。早急にVagrantPappet/Chef といったツール習得の必要性を感じずにはおれない、今日この頃であります。なので、今後はサーバー環境の方に重点を置いた構築の備忘録も書いていこうと思います。
もっとも筆者はいわゆるインフラ専門の技術屋さんではありませんので、そこはあくまでも「ちょっと時代に取り残されてる」アプリケーション開発者から見た学習録であることはご了承ください。何か内容に間違いなどありましたら、ご指摘お願いします。

ファイアウォール

さて、本題に入りましょう。
まず、お断りしておかなくてはいけないのは、筆者はノートPCを1台しか持っておらず、他にサーバーに使えるような機械を持っていないため、もっぱらサーバー環境構築の作業は「さくらVPS」を使うことを通じて経験しています。ですので、マシンハードウェアにディスクを設置して電源は何を使って、OSはどうやってインストールするのか……ということはここでは触れません。もっとも、当ブログにて過去にVMWareでゲストOSの構築をやっている話も書いてきているので、多少はそこが参考にできるかもしれません。

で、さくらVPSですが、「VPS」というのは「仮想プライベートサーバー」の略語らしいですね。へぇ~。仮想化技術はほぼ上っ面の概略程度しか知りませんが、いやはや時代の移り変わりが早いこと。まぁボヤキはそのくらいにして、さくらVPSで仮想サーバーを1台レンタルすると、すぐにさくらから必要な情報の連絡が来てサーバーが使えるようになります。ちなみにOSはCentOS(多分、バージョンは6)を指定。
サーバーを起動した後、最初はさくらVPS専用コンソールからしかアクセスができません。そして、何はともあれこのコンソールから最低限のセキュリティ設定を真っ先にしなければなりません。具体的にはパケットフィルタリング(ファイアウォール)とセキュアシェル(SSH)の設定ですね。

基本設定
ファイアウォールは、icmp, ループバック、確立済みの接続とセキュアシェル新規接続以外の送受信を無効にします。
[root@ap]# iptables -t filter -F                                       
[root@ap]# ip6tables -t filter -F
[root@ap]# iptables -P INPUT DROP
[root@ap]# iptables -P FORWARD DROP
[root@ap]# iptables -P OUTPUT DROP
[root@ap]# ip6tables -P INPUT DROP
[root@ap]# ip6tables -P FORWARD DROP
[root@ap]# ip6tables -P OUTPUT DROP

iptablesとip6tablesはそれぞれIPv4とIPv6に対応したパケットフィルタリングを制御するためのコマンドで、この設定内容をサーバー再起動後も保存したい場合は
[root@ap]#service iptables save
[root@ap]#service ip6tables save

とやる。
その後、icmpとループバックプロトコル、一旦接続済みとなった通信を許可に変更。
[root@ap]# iptables -A INPUT -p icmp -j ACCEPT
[root@ap]# iptables -A FORWARD -p icmp -j ACCEPT
[root@ap]# iptables -A OUTPUT -p icmp -j ACCEPT
[root@ap]# ip6tables -A INPUT -p icmp -j ACCEPT
[root@ap]# ip6tables -A FORWARD -p icmp -j ACCEPT
[root@ap]# ip6tables -A OUTPUT -p icmp -j ACCEPT
[root@ap]# iptables -A INPUT -i lo -j ACCEPT
[root@ap]# iptables -A OUTPUT -o lo -j ACCEPT
[root@ap]# ip6tables -A INPUT -i lo -j ACCEPT
[root@ap]# ip6tables -A OUTPUT -o lo -j ACCEPT
[root@www6419up ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j AC
CEPT
[root@ap]# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j
ACCEPT
[root@ap]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j A
CCEPT
[root@ap]# ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j A
CCEPT
[root@ap]# ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j
ACCEPT
[root@ap]# ip6tables -A OUTPUT -m state --state ESTABLISHED,RELATED -j
ACCEPT

それからSSHの受信ポートを開ける必要があるので、
[root@ap]# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1234 -j ACCEPT

とする。ポート番号は標準の22番ではなく1234とする。(この値はSSHの設定と同期がとれていれば、ポート番号の許容する範囲で何を使っても良い)
最後に、フィルタで処理を拒否したパケットのログが取れると通信が上手く行かないときに便利なのでその設定を入れる。
[root@ap]# iptables -A INPUT -j LOG --log-prefix "[input rejected]"
[root@ap]# iptables -A OUTPUT -j LOG --log-prefix "[output rejected]"
[root@ap]# ip6tables -A INPUT -j LOG --log-prefix "[input rejected]"
[root@ap]# ip6tables -A OUTPUT -j LOG --log-prefix "[output rejected]"
[root@ap]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
[root@ap]# service ip6tables save
ip6tables: Saving firewall rules to /etc/sysconfig/ip6tables: [ OK ]

ちなみservice iptables save(IPv6の方はip6tablesに置き換える)で設定内容を保存すると、/etc/sysconfig/iptables(/etc/sysconfig/ip6tables)の内容はこんな感じになる。
# Generated by iptables-save v1.4.7 on Wed Jun  4 00:05:53 2014                 
*filter
:INPUT DROP [3:96]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1234 -j ACCEPT
-A INPUT -j LOG --log-prefix "[input rejected]"
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -j LOG --log-prefix "[output rejected]"
COMMIT
# Completed on Wed Jun 4 00:05:53 2014

ぶっちゃけ、このファイルができたらその後はこれを直接いじって、iptables(ip6tables)を再起動させても良い感じではある。(再起動は service iptables restart)

セキュアシェルの基本設定

つぎにSSHサーバの設定をば。
デフォルトでは22番ポートを受信に使うところを、いかにもクラッカーに狙われそうなので先ほどパケットフィルタリングで接続許可した1234番に変更。ルートユーザーの直接ログインは不許可。それから公開鍵認証の設定を後で行うため、認証方式を一旦ユーザーアカウントパスワード認証に変更しておく。
[root@ap] #vi /etc/ssh/sshd_config           
(中略)
PasswordAuthentication yes # <= これを追加
PermitRootLogin no # <= これを追加
Port 1234 # &lt:= これを追加

ここでSSHを再起動し、このサーバーに対してteraterm等のコンソールからSSHアクセスをテストすると、とりあえず通常のパスワード認証ではあるがログインできるようになるだろう。
ちなみに、ここには書いていないが、既にルートユーザーログインを遮断しているので、別途アカウントを作っておく必要はある。(コマンドはuseradd, passwdを使う)

(つづく)

参考文献・URL:
CentOS6で作るネットワークサーバ構築ガイド 秀和システム刊
Linuxサーバーセキュリティ オライリー刊
  

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

フリーエリア

最新CM

バーコード

ブログ内検索

Copyright ©  -- ぢみへんプログラミング日誌 --  All Rights Reserved

Design by CriCri / Material by petit sozai emi / powered by NINJA TOOLS / 忍者ブログ / [PR]