ここまでの講座で、あなたはどんなことができるようになりましたか?
- Linuxサーバーにリモートログイン
- Linuxの基本的なコマンド
- Linuxのディレクトリと主な役割
- インターネットの名前解決の仕組み
- vi(vim)でファイル編集
ができるようになっていると思います。
su塾の受講生がサーバーにログインしている時間は1日平均80分くらい。
ディレクトリを隅々まで移動してファイルを表示させたり、色んなドメインのIPアドレスを調べてみたり、楽んでいる人もいらっしゃいますね。
なんでそんなことが分かるんだろう?
historyコマンドで、今まで入力したコマンドが表示されます。
history | less
あなたが今までどんなコマンドをタイプしてきたのか振り返ってみてください。
これまでに得られた知識とタイプしてきたコマンドが今後役に立ちます。
目次
アクセス制限は最初に行う
今回の講座では「最低限行っておくべきアクセス制限」と題して進めていきます。
本来サーバーを構築する際、まず最初に行うべき設定がアクセス制限。
今後あなたがサーバーを構築するとき、必ず最初にアクセス制限をかけてから構築するようにしてください。
記録の習慣化
第1回目の講座の記事に、
サーバーにログインした日時を、毎回ノートなどに記録してください。
と書きましたが、記録はしていますか? 何でもそうですが、記録することは重要です。
最初は記録していたのですが、途中から記録するの忘れてました…
記録はサーバーエンジニアにとって仕事の一部、心がけましょうね!
lastコマンド
last -a
ログインしたID、日時、接続したIPアドレスが表示されると思います。
記録していたログイン日時と、表示された内容は一致していますか?
もし一致しない場合は、あなた以外の何者かがサーバーに侵入した可能性があります。注意深くチェックしてください。
もしサーバーにログインした日時を記録していなかったのなら、このようなチェックはできません。
動画講座 最低限行っておくべきアクセス制限
Linuxのログ機能
Linuxにはイベントが発生する度にその内容が記録されるログ機能があり、そのログには、あなたがターミナルを使ってサーバーにログインする時から記録されます。
全てのイベントが一つのファイルに書き込まれるわけではありません。
/etc/rsyslog.conf
認証やセキュリティに関するログは/var/log/secureに記録するというように、/etc/rsyslog.confで指定されています。
46 #### RULES ####
47
48 # Log all kernel messages to the console.
49 # Logging much else clutters up the screen.
50 #kern.* /dev/console
51
52 # Log anything (except mail) of level info or higher.
53 # Don’t log private authentication messages!
54 *.info;authpriv.none /var/log/messages
55
56 # The authpriv file has restricted access.
57 authpriv.* /var/log/secure
58
59 # Log all the mail messages in one place.
60 mail.* -/var/log/maillog
61
62
63 # Log cron stuff
64 cron.* /var/log/cron
インターネットサーバーの過酷な実態
動画でご覧いただいたように、あなたのサーバーにも何者かがsshでリモートログインをしようとしているログが記録されているはずです。
/var/log/secure ログを確認
secureログを見ることで、あなたのサーバーに対してどのようなアクセスがあったのかを確認することができます。
lessコマンド
less /var/log/secure
lessを終了する時は、qキーをタイプします。
lessの使い方
j | 下方向に移動 |
k | 上方向に移動 |
d | 下方向に半ページ進む |
u | 上方向に半ページ戻る |
f | 下方向に1ページ進む |
b | 上方向に1ページ戻る |
g | 先頭行に移動 |
G (Shift + g) | 最終行に移動 |
q | 終了 |
grepで”Failed password”を抽出
grepコマンドを利用して、ログインを失敗したログのみを表示させてみましょう。
grep "Failed password" /var/log/secure
いかがですか? 何件くらいヒットしましたか?
Jul 27 10:46:59 www sshd[24361]: Failed password for invalid user root from 124.xxx.xxx.xxx port 57318 ssh2
Jul 27 10:47:03 www sshd[24369]: Failed password for invalid user root from 143.xxx.xxx.xxx port 46208 ssh2
Jul 27 10:47:03 www sshd[24371]: Failed password for invalid user vishal from 167.xxx.xxx.xxx port 59042 ssh2
Jul 27 10:47:09 www sshd[24373]: Failed password for invalid user root from 49.xxx.xxx.xxx port 35474 ssh2
Jul 27 10:47:13 www sshd[24373]: Failed password for invalid user root from 49.xxx.xxx.xxx port 35474 ssh2
Jul 27 10:47:14 www sshd[24375]: Failed password for invalid user root from 159.xxx.xxx.xxx port 55646 ssh2
Jul 27 10:47:17 www sshd[24373]: Failed password for invalid user root from 49.xxx.xxx.xxx port 35474 ssh2
Jul 27 10:47:42 www sshd[24385]: Failed password for invalid user root from 124.xxx.xxx.xxx port 60212 ssh2
Jul 27 10:48:07 www sshd[24397]: Failed password for invalid user root from 143.xxx.xxx.xxx port 36172 ssh2
Jul 27 10:48:08 www sshd[24395]: Failed password for invalid user test from 179.xxx.xxx.xxx port 13906 ssh2
Jul 27 10:48:10 www sshd[24399]: Failed password for invalid user root from 49.xxx.xxx.xxx port 56126 ssh2
Jul 27 10:48:11 www sshd[24401]: Failed password for invalid user study from 167.xxx.xxx.xxx port 48716 ssh2
Jul 27 10:48:13 www sshd[24399]: Failed password for invalid user root from 49.xxx.xxx.xxx port 56126 ssh2
Jul 27 10:48:15 www sshd[24399]: Failed password for invalid user root from 49.xxx.xxx.xxx port 56126 ssh2
Jul 27 10:48:23 www sshd[24410]: Failed password for invalid user root from 124.xxx.xxx.xxx port 34870 ssh2
Jul 27 10:48:23 www sshd[24412]: Failed password for invalid user root from 64.xxx.xxx.xxx port 50922 ssh2
Jul 27 10:48:28 www sshd[24415]: Failed password for invalid user root from 159.xxx.xxx.xxx port 43802 ssh2
数え切れません...
grepとwcを組み合わせれば簡単に件数表示ができます。
wcコマンド
grep "Failed password" /var/log/secure | wc -l
72258
72,258件って嘘ですよね...
簡単なパスワードを設定していたら?
これらのリモートアタック(攻撃)は、ログインできそうなサーバーをサーチしてパスワードのクラックを試みます。
もし簡単なパスワードを設定していたら、容易に侵入されサーバーを乗っ取られてしまいます。
相手を知り、己を知る
どんな相手が攻撃をしているのか調べるためにwhoisコマンドをインストールします。
whoisのインストール
yum install whois
whoisコマンドを使うと、
登録者や技術管理者などに関する情報を参照することができます。
攻撃者の接続元を調べる
例えば、grep "Failed password" /var/log/secure で表示されたIPアドレスの一つをwhoisで調べてみましょう。
whois 124.172.192.63
調べるIPアドレスよって表示は変わりますが、おおよそこのように表示されます。
[Querying whois.apnic.net]
inetnum: 124.172.192.0 – 124.172.255.255
netname: NGNNET
descr: World Crossing Telecom(GuangZhou) Ltd.
descr: 17/FL,International Bank Center,
descr: 191# DongFengXi Rd. Guangzhou, Guangdong
country: CN
admin-c: ZJ531-AP
tech-c: PL19-AP
remarks: Send abuse reports to spam@gzidc.com
mnt-by: MAINT-CNNIC-AP
mnt-irt: IRT-CNNIC-CN
mnt-lower: MAINT-CNNIC-AP
mnt-routes: MAINT-CNCGROUP-RR
status: ALLOCATED PORTABLE
last-modified: 2016-07-04T02:28:20Z
source: APNIC
あなたの接続元を調べる
攻撃者の接続元を調べたのと同じように、あなたの接続元も調べてみましょう。
grep "Accepted" /var/log/secure
もしくは、この記事の最初にも書いたように、次のように調べることもできます。
last -ai | less
あなたのIPアドレスがどのようなネットワークに属しているのか調べてください。
国内プロバイダーや携帯キャリアのIPアドレスを調べる際は、日本のwhoisサーバー(whois.nic.ad.jp)を指定するとネットワークアドレスを求めやすくなることがあります。
whois -h whois.nic.ad.jp __IP__
通常接続するご自宅の他、外出先でも接続する場合、接続する場所によってはネットワークアドレスが大きく変わることがあるのでご注意ください。
auの回線を使った場合
例として、auの回線を使ってサーバーにログインしたものを調べてみます。
東京で接続した例
東京で接続した時のIPアドレスは、106.129.209.133 でした。
whois -h whois.nic.ad.jp 106.129.209.133
whoisコマンドでIPアドレスを調べます。
a. [Network Number] 106.129.209.0/24
宮崎で接続した例
宮崎で接続した時は、106.133.162.220 で、ネットワークアドレスは以下の通り。
a. [Network Number] 106.133.162.0/24
東京と宮崎の結果を見比べてみると、
a. [Network Number] 106.129.209.0/24 <---東京
a. [Network Number] 106.133.162.0/24 <---宮崎
このように違いがあることが分かります。
Network Numberに表示されるネットワークアドレスは、あくまでも今接続しているIPアドレスが属しているものということを認識してください。
TCP Wrapperによるアクセス制限
ここではauを例に動的IPアドレスを利用している場合の設定すべきネットワークアドレスの解説をしました。
- lastコマンドで自分のIPアドレスを確認
- whoisコマンドでIPアドレスがどのようなネットワークに属しているのか調べる
あなたの接続を許可するネットワークアドレスが導き出されたなら、今度はそのネットワークアドレスを設定していきます。
許可リストの設定
CentOS 8 はTCP Wrapperが使用できません。
別の方法でアクセス制限を行います。
vi /etc/hosts.allow
許可するネットワークアドレスをネットマスク形式で /etc/hosts.allow の行末に記入。
/etc/hosts.allow
#
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
sshd: 106.128.0.0/10 # au <--- 追記
「sshd:」は、sshを待ち受けしているデーモン(プログラム名)です。
「# au」はどこのネットワークなのかコメントを記入しています。
拒否リストの設定
vi /etc/hosts.deny
hosts.deny には、拒否リストを記述します。
/etc/hosts.deny
#
# hosts.deny This file contains access rules which are used to
# deny connections to network services that either use
# the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# The rules in this file can also be set up in
# /etc/hosts.allow with a 'deny' option instead.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
ALL: ALL <--- 追記
TCP Wrapperによるアクセス制限では、最初にhosts.allowが評価され、次にhosts.denyが評価されます。
hosts.denyの設定が無ければ、全てアクセスを許可されているのと同じです。
hosts.deny 設定後のチェック
hosts.allowの設定が誤っていると、sshログインすることができなくなってしまいます。
hosts.denyの設定後、現在の接続はそのままにしておき、別のターミナルで接続できるかチェックしてください。
次はSSHの待受ポートを変更してよりセキュアにします。
コメント