【gloudコマンド】ファイアーウォール ルールへ複数IPを設定するシェルを作った
どうもてぃです。
ちょっと前に書いた記事でファイアーウォールルールを20個弱作成しました。
確認しながらだったので1時間弱の工数。
これをプロジェクト毎に同じ量作成していくって考えるとおぞましい。まじで。
本来なら別プロジェクトでもファイアーウォールルールを共有できたらと思っていろいろ調べてたのですが、よーわからんかったので今回の方法に落ち着きました。
経緯
GCPへ移行させたとある会社のサーバーへ、1分間に3、 4通の頻度で大量の迷惑メールが届いているとの報告をうけました。
ドメインはqq.com
です。中国?のメールらしい。
Sendgridの管理画面を見てみるとランダムな数字@qq.com
のメールが頻繁にきてました。
アクセスログを見てIPを検索した結果、ほぼすべてがフィリピンからの攻撃。
いままで、中国から攻撃が来てたのでその対策はしてたのですが、盲点でした。
思い込みって怖いですね。
今後もファイアーウォールルールを作るって考えると本当に鬱になりそうだったので、だれでもシェルを叩いて作成でき、GitHubに公開して共有すればみんな幸せになるんじゃなかろうか、ということで作成しました。
準備
ローカルでgloudコマンドが使える環境を作っておいてください。
インストール方法は上の記事に載ってます。
GitHub貼っておくのでcloneしてください。
README.mdに拙い英語でやり方書いてるので、文章間違えあればプルリクおねがいします。
中国、韓国、北朝鮮、フィリピンのIPを制限
cn-kr-kp-firewall.sh
が中国、韓国、北朝鮮のIPを制限するシェルです。
philippines-firewall.sh
がフィリピンのIPを制限するシェル。
また攻撃先があれば随時シェルを追加していきます。
さいごに
本当はもっとシェルスクリプトをうまく使って、.txtを全て整形してgcloudコマンド実行させたかった。
もっと勉強します。
【備忘録】docker exec <container ID> bash -cで怒られた
docker exec
でls
コマンドを打とうとしたらエラーが出たので、備忘録として。
環境
- Docker 17.12.0-ce, build c97c6d6
- elementary OS 0.4.1 Loki (ubuntu 16.04.1)
状態
docker psで出てくるのが以下2つです。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5f5341ffb035 0f9e103b1a23 "bash" About an hour ago Up About an hour xenodochial_albattani 402d9d6b0227 ubuntu:16.04 "bash" About an hour ago Up About an hour gifted_meninsky
一番上のコンテナ内のルートディレクトリを参照したい。
$ docker exec 5f5341ffb035 bash -c 'ls /' OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"/bin/bach\": stat /bin/bach: no such file or directory": unknown
だめっぽい。
$ docker exec 5f5341ffb035 /bin/bash -c 'ls /' OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"/bin/bach\": stat /bin/bach: no such file or directory": unknown
だめですね。
解決
これですね。
docker exec
のオプションが足りなかった模様。
docker exec -i 5f5341ffb035 bash -c 'ls /' bin boot dev etc home lib lib64 media mnt opt proc root run samplefile sbin srv sys tmp usr var
わざわざコンテナの中に入らずとも無事参照できました。
おわりに
dockerのロゴ使用に決まりとかあったんですね。
みなさんも気をつけましょう。
【Linuxコマンド】特定のファイルを削除する
どうもってぃです。
サーバー移行している時に不要なファイルが大量に出てきたので全検索削除を行いました。
そんときのメモがこちら。
ディレクトリ配下該当ファイル全削除
$ find . -name '.htaccess' | xargs rm -f
apacheからnginxへ移行するときに不要になる.htaccess
ファイルがどのディレクトリにもあったので、上記のコマンドで削除しました。
くっそ邪魔な.DS_Store
も
$ find . -name '.DS_Store' | xargs rm -f
これでおk。
lsとgrepを使う
今いるディレクトリの.txt
ファイルを全て削除したい場合
$ ls | grep .txt | xargs rm
ディレクトリ配下全ての.txt
を削除したい場合
$ find . | grep .txt | xargs rm -f
今回サーバー移行で大量にあったのが旧
がファイル名に入っているもの。
エンジニアでなければ前のファイルはバックアップを取らずに旧
という文字列を頭につけてそのまま残しておくみたい。
いと愚かなり。
$ find . | grep 旧 | xargs rm -f
いらないものは削除しましょう。
終わりに
find . -name 'ファイル名'
もfind . | grep hoge
も、どれもそうですが、削除する前に一度検索かけて、該当するものが出てきているか確認してから削除しましょう。
いきなり削除してしまって、ああ削除したらいけんやったのにぃ〜となっても知りませんよ。
くれぐれも、気をつけてくださいね。
番外編
nginxのプロセスを全て削除したい場合
$ ps aux | grep [n]ginx | awk '{ print "kill -9", $2 }'
【gloudコマンド】ファイアーウォール ルールへ複数IPを設定する
いろんなサイトをサーバー移行しています。
その中で、とあるサイトがかなり攻撃を受けるらしく、ストレージをS3に持って行き、サクラVPSで運用しているといったことを聞き、それならいっそのこと攻撃元の海外を全て遮断してしまえばいいんじゃないかと思いやってみました。
gloudコマンドのインストール
まずcurl
でとってくる。
$ curl https://sdk.cloud.google.com | bash
Y/n
と何回か聞かれるけど、基本的に全部Enter
でおk。
最後に
Enter a path to an rc file to update, or leave blank to use [/home/User/.bashrc]:
と聞かれるので、bashrcで管理してる人は特に意識せずそのままEnter
。僕はこのまま行きました。
zsh
だとめんどくさいみたいですけど。
.bashrc
を読み込みなおしてwhichでパスが表示されればおk。
$ source ~/.bashrc $ which gloud ~/google-cloud-sdk/bin/gcloud
gloud initで認証
自分のアカウントにログインします。
$ gcloud init Welcome! This command will take you through the configuration of gcloud. Your current configuration has been set to: [default] You can skip diagnostics next time by using the following flag: gcloud init --skip-diagnostics Network diagnostic detects and fixes local network connection issues. Checking network connection...done. Reachability Check passed. Network diagnostic (1/1 checks) passed. You must log in to continue. Would you like to log in (Y/n)? y
y
もしくはEnter
を押すと、ブラウザが開いて、googleのアカウントログイン画面に飛びます。
ログインがうまく行けば認証完了。 ターミナルに戻ると、
既存のブラウザ セッションに新しいウィンドウが作成されました。 You are logged in as: [example@test.com]. Pick cloud project to use: [1] test-project [2] testtest-project Please enter numeric choice or text value (must exactly match list item):
と、プロジェクトを既に作成していれば、候補が出てくるので適当に選択します。
次に、リージョンを選択すれば終わりです。僕は面倒だったのでデフォルトのままにしてます。
中国、韓国、北朝鮮のIPを遮断
する前に、リストを作成します。
以下にアクセス。
https://ipv4.fetus.jp/krfilter
cn,kr,kp
のnginx用の雛形を開きます。
全てコピーして、vimで42.156.0.0/19,
の形に総置換、総整形します。
これでおk。
実際には250行ごとに改行をなくす置換したものを使っていきます。
firewallルールの作成
ブラウザ上で作成したものに対してupdateかければ簡単です。
雛形こんな感じ。
ソースIPの範囲は適当で大丈夫です。あとからupdateかけるので。
ちなみに、この一つのルールに255個しか設定できないみたいなので、何個も作る形になります。
根気、大事。
gloudコマンドでfirewallをアップデート
gcloudコマンドはTAB
補完が優秀ですね。
それはおいておいて、今回の対象ルールはchina-block-01
です。
前に準備しておいた、中国IPを250個くらいコピーして--source-ranges
オプションの後にくっつけます。
$ gloud compute firewall-rules update chine-block-01 \ --source-ranges 1.0.1.0/24,1.0.2.0/23,1.0.8.0/21,1.0.32.0/19,1.1.0.0/24,1.1.2.0/23,1.1.4.0/22,1.1.8.0/21,1.1.16.0/20,1.1.32.0/19,1.2.0.0/23,1.2.2.0/24,1.2.4.0/22,1.2.8.0/21,1.2.16.0/20,1.2.32.0/19,1.2.64.0/18,1.3.0.0/16,1.4.1.0/24,1.4.2.0/23,1.4.4.0/22,1.4.8.0/21,1.4.16.0/20,1.4.32.0/19,1.4.64.0/18,1.8.0.0/16,1.10.0.0/21,1.10.8.0/23,1.10.11.0/24,1.10.12.0/22,1.10.16.0/20,1.10.32.0/19,1.10.64.0/18,1.11.0.0/16,1.12.0.0/14,1.16.0.0/14,1.24.0.0/13,1.45.0.0/16,1.48.0.0/14,1.56.0.0/13,1.68.0.0/14,1.80.0.0/12,1.96.0.0/12,1.116.0.0/14,1.176.0.0/15,1.180.0.0/14,1.184.0.0/15,1.188.0.0/14,1.192.0.0/13,1.201.0.0/16,1.202.0.0/15,1.204.0.0/14,1.208.0.0/12,1.224.0.0/11,14.0.0.0/21,14.0.12.0/22,14.0.32.0/19,14.0.64.0/18,14.1.0.0/22,14.1.24.0/22,14.1.96.0/22,14.1.108.0/22,14.4.0.0/14,14.16.0.0/12,14.32.0.0/11,14.64.0.0/11,14.102.128.0/22,14.102.156.0/22,14.102.180.0/22,14.103.0.0/16,14.104.0.0/13,14.112.0.0/12,14.128.128.0/17,14.129.0.0/16,14.130.0.0/15,14.134.0.0/15,14.138.0.0/16,14.144.0.0/12,14.192.60.0/22,14.192.76.0/22,14.192.80.0/20,14.196.0.0/15,14.204.0.0/15,14.206.0.0/16,14.208.0.0/12,27.0.128.0/21,27.0.160.0/21,27.0.188.0/22,27.0.204.0/22,27.0.208.0/21,27.0.236.0/22,27.1.0.0/16,27.8.0.0/13,27.16.0.0/12,27.34.232.0/21,27.35.0.0/16,27.36.0.0/14,27.40.0.0/13,27.50.40.0/21,27.50.128.0/17,27.54.72.0/21,27.54.152.0/21,27.54.192.0/18,27.96.128.0/18,27.98.208.0/20,27.98.224.0/19,27.99.128.0/17,27.100.128.0/17,27.101.0.0/16,27.102.0.0/15,27.106.128.0/18,27.106.204.0/22,27.109.32.0/19,27.109.124.0/22,27.111.96.0/19,27.112.0.0/18,27.112.80.0/20,27.112.112.0/21,27.112.128.0/17,27.113.0.0/17,27.113.128.0/18,27.115.0.0/16,27.116.44.0/22,27.116.64.0/18,27.116.128.0/17,27.117.0.0/16,27.118.64.0/18,27.118.128.0/17,27.119.0.0/16,27.120.0.0/18,27.121.72.0/21,27.121.120.0/21,27.122.128.0/17,27.123.232.0/22,27.124.128.0/17,27.125.0.0/17,27.126.0.0/18,27.128.0.0/15,27.131.220.0/22,27.144.0.0/16,27.148.0.0/14,27.152.0.0/13,27.160.0.0/11,27.192.0.0/11,27.224.0.0/14,27.232.0.0/13,27.255.64.0/18,36.0.0.0/22,36.0.8.0/21,36.0.16.0/20,36.0.32.0/19,36.0.64.0/18,36.0.128.0/17,36.1.0.0/16,36.4.0.0/14,36.16.0.0/12,36.32.0.0/14,36.36.0.0/16,36.37.0.0/19,36.37.36.0/23,36.37.39.0/24,36.37.40.0/21,36.37.48.0/20,36.38.0.0/15,36.40.0.0/13,36.48.0.0/15,36.51.0.0/16,36.56.0.0/13,36.96.0.0/11,36.128.0.0/10,36.192.0.0/11,36.248.0.0/14,36.254.0.0/16,36.255.116.0/22,36.255.128.0/22,36.255.164.0/22,36.255.172.0/22,36.255.176.0/22,36.255.220.0/22,39.0.0.0/24,39.0.2.0/23,39.0.4.0/22,39.0.8.0/21,39.0.16.0/20,39.0.32.0/19,39.0.64.0/18,39.0.128.0/17,39.4.0.0/14,39.16.0.0/12,39.64.0.0/11,39.96.0.0/13,39.104.0.0/14,39.108.0.0/16,39.112.0.0/12,39.128.0.0/10,40.72.0.0/15,40.125.128.0/17,40.126.64.0/18,42.0.0.0/22,42.0.8.0/21,42.0.16.0/21,42.0.24.0/22,42.0.32.0/19,42.0.128.0/17,42.1.0.0/19,42.1.32.0/20,42.1.48.0/21,42.1.56.0/22,42.1.128.0/17,42.4.0.0/14,42.8.0.0/13,42.16.0.0/12,42.32.0.0/12,42.48.0.0/13,42.56.0.0/14,42.62.0.0/17,42.62.128.0/19,42.62.160.0/20,42.62.180.0/22,42.62.184.0/21,42.63.0.0/16,42.80.0.0/15,42.82.0.0/16,42.83.64.0/20,42.83.80.0/22,42.83.88.0/21,42.83.96.0/19,42.83.128.0/17,42.84.0.0/14,42.88.0.0/13,42.96.64.0/19,42.96.96.0/21,42.96.108.0/22,42.96.112.0/20,42.96.128.0/17,42.97.0.0/16,42.99.0.0/18,42.99.64.0/19,42.99.96.0/20,42.99.112.0/22,42.99.120.0/21,42.100.0.0/14,42.120.0.0/15,42.122.0.0/16,42.123.0.0/19,42.123.36.0/22,42.123.40.0/21,42.123.48.0/20,42.123.64.0/18,42.123.128.0/17,42.128.0.0/12 Updated [https://www.googleapis.com/compute/v1/projects/あなたのプロジェクト名/global/firewalls/china-block-01].
問題なければupdated
と出てきます
GCPのファイアーウォールルールを確認すると。。。
(入りきれてないですが)ちゃんと更新されてるのが確認できました\(^o^)/
おわりに
https://cloud.google.com/compute/docs/reference/rest/v1/firewalls/update
ここのTry this APIが固まって使えなかったので、gcloudコマンド入れてやる次第になったのですが、複数一気に追加できるのは凄い便利です。
updateではなくcreateで作った方がいいなと思ったり思わなかったり。
追記
最終的にファイアーウォールルールを24個も作成しました。
同じ作業の繰り返しでうつになるかとおもった。
Google Compute Engineのsshが突然接続できなくなった
いろんなサーバーをGCPに移行していっているんですが、突然ブラウザ上のSSHコンソールが接続できなくなったので対処法を書こうと思います。
環境
原因不明
文字通り突然接続できなくなりました。
他プロジェクトのVMインスタンスでは接続できるのにどうしてこんなことが起こったのか謎。
ちなみにSSHはカスタムポートで動くように設定してます。
ファイアーウォールルールも設定済みで、sshd_configにも記述済みの状態です。
マジ謎。
エラーメッセージ
プロジェクト メタデータへの鍵転送に異常に長い時間がかかっています。インスタンス メタデータに転送する方が所要時間は短くなる可能性がありますが、鍵が転送されるのはこの VM のみになります。この仮想マシンから他の仮想マシンに SSH 接続する場合は、鍵を適切に転送する必要があります。 鍵をインスタンス メタデータに転送する場合は、こちらをクリックしてください。この設定は後で変更できず、有効にした後に、[インスタンスの詳細] ページで無効にする必要があります。
その後に一瞬ですがシリアルコンソール
云々という文言が出てきたので、とりあえずVMインスタンスからシリアルコンソールを開きました。
開けない(disabledになっている)方はインスタンスの編集からシリアルポート接続を許可
にチェックを入れてください。
やったこと
VMインスタンスから該当のインスタンス名をクリック、その後「シリアルコンソールに接続」で接続できます。
接続するとえげつない量のエラーが。。。
vm google-accounts: ERROR Exception calling the response handler. [Errno 28] No space left on device.#012Traceback (most recent call last):#012 File "/usr/lib/python2.7/site-packages/google_compute_engine/metadata_watcher.py", line 196, in WatchMetadata#012 handler(response)#012 File "/usr/lib/python2.7/site-packages/google_compute_engine/accounts/accounts_daemon.py", line 263, in HandleAccounts#012 self.utils.SetConfiguredUsers(desired_users.keys())#012 File "/usr/lib/python2.7/site-packages/google_compute_engine/accounts/accounts_utils.py", line 288, in SetConfiguredUsers#012 updated_users.flush()#012IOError: [Errno 28] No space left on device
なんか容量っぽい・・・。
# df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/sda1 15716368 15716348 20 100% / devtmpfs 3481172 0 3481172 0% /dev tmpfs 3488804 0 3488804 0% /dev/shm tmpfs 3488804 17828 3470976 1% /run tmpfs 3488804 0 3488804 0% /sys/fs/cgroup tmpfs 697764 0 697764 0% /run/user/1000 tmpfs 697764 0 697764 0% /run/user/0
100%
ということで少しファイル数を減らして、容量をあけることにします。
シリアルコンソール接続中も継続的にエラーが出てきてたのですが、容量を開けたら出なくなりました。
SSHコンソールに接続
だめですねぇ :)
もう一回シリアルコンソールに接続して、firewallとselinuxがdisableになっているか確認します。
$ sudo systemctl is-enabled firewalld disabled $ getenforce disabled
どっちもdisabledになってるね。
とりあえずよくわからんからsudo yum update
すると、固まりました\(^o^)/。
ctrl + c
してもダメ、ウィンドウ閉じて開き直してもダメ。
いまのところ打つ手なし。
諦めてローカルからSSH
正直ブラウザのコンソールだと感度悪いし、起動速度もそんなに速くないです。
これを機に大人しくローカルから接続する方法に切り替えました。
$ cd ~/.ssh & ssh-keygen -t rsa -b 4096 -C "rdwbocungelt5@gmail.com" #=> あとは順をおって作成するだけ。
出来上がったrsa.pub
をコピーして、GCEのメタデータに貼っつけます。
Compute Engine -> メタデータ -> SSH認証鍵 -> 編集
で鍵を貼り付けるだけです。
おわりに
ブラウザからSSHコンソールに接続する方法は解決できませんでしたが、暫定的にローカルからSSHすることで解決させました。
解決策が見つかれば後日追記等したいと思います。
後日追記(7 / 31)
久しぶりにブラウザからSSHコンソール開いてみたら何の問題もなく開きました。
時間が解決してくれるってことですかね。
失恋じゃねえんだから。
MySQLでユーザーを作成するとAccess Deniedで弾かれる
はい、出ました。
またMySQLのエラー。
zabbixでDB周りの監視をやるための設定をしている時に詰まりました。
ハマった経緯
いつもこちらのサイトを参考にさせてもらってるんですが、 MySQL監視用ユーザー作成の部分で詰まりました。
$ mysql -u root -p password: MariaDB [(none)]> grant process on *.* to zabbixagent@localhost identified by '<password>'; ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
はい、エラーです。
対処法
まずはmysqlを止める。
$ service mysqld stop
既にzabbixで監視対象にしているので、調査しているときに障害通知メールが来ました。
zabbix優秀ですね。
次に、 --skip-grant-tables
で立ち上げ直す。
$ mysqld_safe --skip-grant-tables
そして、/etc/my.cnf.d/server.cnf
にskip-grant-tablesを追加する。
$ vim /etc/my.cnf.d/server.cnf ・ ・ ・ [mysqld] ・ ・ ・ skip-grant-tables #=> 僕は最後の行に入れました [galera] ・ ・ ・
ここまで終わったら、mysqlを立ち上げ直す。
$ service mysqld start
ここで、mysqlにログインしてみます。--skip-grant-tables
をやっているのでパスワード無しでいけます。
$ mysql -u root Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.1.34-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
念願のcreate userをやってみると・・・
MariaDB [(none)]> create user zabbixagent identified by 'password'; ERROR 1290 (HY000): The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement
ん〜、だめっぽい。
データベースを見てみると、mysql
ってのができているのでみてみると・・・
MariaDB [(none)]> use mysql; MariaDB[(mysql)]> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | column_stats | | columns_priv | | db | | event | | func | | general_log | | gtid_slave_pos | | help_category | | help_keyword | | help_relation | | help_topic | | host | | index_stats | | innodb_index_stats | | innodb_table_stats | | plugin | | proc | | procs_priv | | proxies_priv | | roles_mapping | | servers | | slow_log | | table_stats | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+
userってとこにありそう。
いろいろ探して、ここを参考に直接userをINSERTしてみました。
ここ↓を参考
MariaDB [mysql]> INSERT INTO mysql.user SET user = 'zabbixagent', host = 'localhost', password = Password('password'), -> Select_priv = 'y', -> Insert_priv = 'y', -> Update_priv = 'y', -> Delete_priv = 'y', -> Create_priv = 'y', -> Drop_priv = 'y', -> Reload_priv = 'y', -> Shutdown_priv = 'y', -> Process_priv = 'y', -> File_priv = 'y', -> Grant_priv = 'y', -> References_priv = 'y', -> Index_priv = 'y', -> Alter_priv = 'y', -> Show_db_priv = 'y', -> Super_priv = 'y', -> Create_tmp_table_priv = 'y', -> Lock_tables_priv = 'y', -> Execute_priv = 'y', -> Repl_slave_priv = 'y', -> Repl_client_priv = 'y', -> Create_view_priv = 'y', 2 # These groups are read by MariaDB server. -> Show_view_priv = 'y', -> Create_routine_priv = 'y', -> Alter_routine_priv = 'y', -> Create_user_priv = 'y', -> Event_priv = 'y', -> Trigger_priv = 'y', -> Create_tablespace_priv = 'y'; Query OK, 1 row affected, 4 warnings (0.00 sec)
おっ、いけた。
userテーブルを見てみると先ほど入れたユーザーが入ってました。
いとをかし。
あと始末
先ほど追加した/etc/my.cnf.d/server.cnf
のskip-grant-tables
を削除し、mysqlを起動し直します。
これでおkです。
【備忘録】service nginx restartが失敗し、nginx.pidに苦しめられた
サーバー移行でkusanagiのwordpressを使うことになり、もちろんそれに伴ってnginxの修正が必要でした。
nginxは前の会社でも苦しめられた経験があったので、懸念してましたが見事にハマりましたね。
環境
エラー内容
/etc/nginx/nginx.conf
のuserを変更し、service nginx restart
をしました(nginx -s reload
だったかも)。
すると。。。
$ service nginx restart nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory)
/var/run/nginx.pid
がないみたい。
なので、ファイルを作ってもう一度nginxを立ち上げます。
$ touch /var/run/nginx.pid && service nginx restart nginx: [error] invalid PID number "" in "/var/run/nginx.pid"
invalid PID number
これでぐぐると、nginxのプロセス関係でエラってるっぽい。
解決策
$ service nginx stop $ ps aux | grep nginx
まず、nginxを止めて、出てくるnginxのプロセスを全てkill
してあげる。
※ 該当プロセス全削除は、以下の記事を参照
そしてnginxを起動し直すと。。。
$ service nginx start Redirecting to /bin/systemctl start nginx.service
無事起動できました\(^o^)/