- 投稿日:2020-01-13T23:30:22+09:00
Dockerでnginx等を使う時はまずLinuxの知識をだな......(戒め)
DockerとかVagrantでnginx等を使う時はまずLinuxの知識をだな......(戒め)
1. 背景
フロント学んできて、そろそろバックエンドもまなんでみようと思い、せっかくなので流行りのDokcerを使用しPHPでサーバーに画像をアップロードするコードを書いた。
そしてハマった2. 環境
・windows10<VirtualBox(vagrant)<CentOS7<Docker
起動構成
docker-compose.ymlversion: '3' services: web: #ver 1.17.7 build: ./nginx ports: - '8080:80' links: - php-fpm volumes: - ./data/public:/var/www/html/public depends_on: - php-fpm php-fpm: #ver 7.3 build: ./php-fpm links: - db volumes: - ./data:/var/www/html3. ハマったところ
このPHPの一行からなるエラーで無限に悩んだ
upload.phpmove_uploaded_file($_FILES['image']['tmp_name'], $savePath);Permisson denied ......
4.1 まずやったこと
とりあえず浅いLinuxの知識を用いて画像保存フォルダの権限を
$sudo chmod 777 images
としてコードが動くのを確認。
もちろんこんなセキュリティガバガバな権限は例えローカルサーバーでも許せなかったので却下4.2 解決策
www-dataがUSERだと判明。
じゃあwww-dataに権限付与してあげればよさそうvagrant環境下の権限はこう
$ls -l ~ drwxrwxr-x. 2 vagrant vagrant 4096 Jan 13 08:32 images ~ $ sudo chown www-data images chown: invalid user: ‘www-data’有効ではないと告げられたのでユーザー一覧を確認してみます
$cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ~ vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologinこれ以外にも色々出てきたけどwww-dataユーザーなんて存在しない。
どうすればいいのか
コンテナを立ち上げて
docker exec -it [id] bash
でphp-fpmコンテナに入ってみる。
その中のファイル権限はdrwxrwxr-x. 2 1000 1000 4096 Jan 13 08:32 images1000 1000?
調べてみたらvagrantユーザーのuidが1000らしい。
これも
$cat /etc/passwd
でユーザー一覧を確認するとvagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bashvagrntのuidに1000番が付けられてるのが分かる
VMという仮想環境の中にさらに仮想コンテナがあってそのコンテナ内では1000番uidに名前がついていないという事らしい
つまりコンテナ内では1000番にvagrntユーザーも含めユーザーは存在してないという事
でもuidは共通みたいだならばコンテナ内から確認すればwww-dataがいるはず......
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologinいた
結局どうすればいいのか
正解なのかは分からないけど思いついたのはコンテナ外で33番UIDでグループがvagrantのユーザーを作ってimagesフォルダの持ち主を33番に変える。
これが自分の中でしっくりきました。
というかこれ以外成功してない$useradd -u 33 www-data -g vagrant $chown www-data images他にも
https://gtrt7.com/blog/nginx/docker_userid_share#3docker-composeyml
のようにしてvagrant側からではなくdocker側から合わせればいけるらしい。自分はこんなエラー出てわからんくて投げてしまいましたが
web_1 | 2020/01/13 13:52:54 [emerg] 1#1: host not found in upstream "php-fpm" in /etc/nginx/conf.d/default.conf:20 web_1 | nginx: [emerg] host not found in upstream "php-fpm" in /etc/nginx/conf.d/default.conf:20default.conf:20
fastcgi_pass php-fpm:9000;
正直分からん
Dockerコンテナ内でファイル関係は完結させた方がいいんだろうなと感じてはいるもののいいやり方が浮かばず今回は断念。
ちょっと深堀するにはLinuxやnginx php-fpm等の知識が足りないので今はphpでファイルアップロードしたフォルダを作るさいは適宜権限変更するこのやり方のまま進んで、強くなったら戻ってこようと思いました。
いいやりかたあったら教えてほしい......
- 投稿日:2020-01-13T17:55:41+09:00
[linux testコマンド] ディレクトリの存在確認。多すぎるディレクトリの中に指定するものがあるかどうかを確認する際に使用する
https://orebibou.com/2016/07/linuxunixでファイル・ディレクトリの存在確認をする/
test -f ファイルPATH # ファイルの存在確認 test -d ディレクトリPATH # ディレクトリの存在確認
- 投稿日:2020-01-13T00:39:15+09:00
Ubuntu 19.10 Eoan Ermine で iptables を使ったパケットフィルタリング設定とその永続化
概要
- iptables-save / iptables-restore コマンドで設定を保存・反映する
- IPv4 と IPv6 の両方を設定する
- netfilter-persistent コマンドで設定を永続化する (OS再起動しても設定が消えないようにする)
- nmap でポートスキャンを実行して iptables の設定が反映されているか確認する
iptables-save / iptables-restore コマンドで設定を保存・反映
初期設定を確認する (IPv4)
iptables コマンドと iptables-save コマンドで確認する。
$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination$ sudo iptables-save # Generated by iptables-save v1.8.3 on Sun Jan 12 23:15:35 2020 *filter :INPUT ACCEPT [1796:190499] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1400:212762] COMMIT # Completed on Sun Jan 12 23:15:35 2020ルールを書く (IPv4)
今回はパケットフィルタリングのルールを rules.v4 というファイルに保存した。
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP -A INPUT -p tcp ! --syn -m state --state NEW -j DROP -A INPUT -p tcp --tcp-flags ALL ALL -j DROP -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p udp --sport 53 -j ACCEPT -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT COMMITルールの内容は ファイアウォールiptablesを簡単解説~初心者でもよくわかる!VPSによるWebサーバー運用講座(4) | さくらのナレッジ を参考にした。
ルールを反映する (IPv4)
iptables-restore コマンドでルールを反映する。
$ sudo iptables-restore < rules.v4設定が反映されていることを確認する。
$ sudo iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG ACCEPT icmp -- anywhere anywhere icmp echo-request limit: up to 1/min burst 10 mode srcip htable-expire 120000 ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT udp -- anywhere anywhere udp spt:domain ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN limit: up to 1/min burst 10 mode srcip htable-expire 120000 ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination$ sudo iptables-save # Generated by iptables-save v1.8.3 on Sun Jan 12 23:16:24 2020 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [50:6132] -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP -A INPUT -p icmp -m icmp --icmp-type 8 -m hashlimit --hashlimit-upto 1/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name t_icmp --hashlimit-htable-expire 120000 -j ACCEPT -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p udp -m udp --sport 53 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m hashlimit --hashlimit-upto 1/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name t_sshd --hashlimit-htable-expire 120000 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT COMMIT # Completed on Sun Jan 12 23:16:24 2020初期設定を確認する (IPv6)
ip6tables コマンドと ip6tables-save コマンドで確認する。
$ sudo ip6tables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination$ sudo ip6tables-save # Generated by ip6tables-save v1.8.3 on Sun Jan 12 20:37:47 2020 *filter :INPUT ACCEPT [328:22552] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [448:31496] COMMIT # Completed on Sun Jan 12 20:37:47 2020ルールを書く (IPv6)
今回はパケットフィルタリングのルールを rules.v6 というファイルに保存した。
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] COMMITルールを反映する (IPv6)
ip6tables-restore コマンドでルールを反映する。
$ sudo ip6tables-restore < rules.v6設定が反映されていることを確認する。
$ sudo ip6tables -L Chain INPUT (policy DROP) target prot opt source destination Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination$ sudo ip6tables-save # Generated by ip6tables-save v1.8.3 on Mon Jan 13 00:10:54 2020 *filter :INPUT DROP [18:1296] :FORWARD DROP [0:0] :OUTPUT DROP [74:5328] COMMIT # Completed on Mon Jan 13 00:10:54 2020netfilter-persistent コマンドで設定を永続化
永続化する意味
iptables の設定は OS 再起動時に初期状態に戻ってしまう。
netfilter-persistent コマンドで設定を永続化しておくと、OS 起動時に設定内容を再反映してくれる。iptables-persistent パッケージをインストール
netfilter-persistent コマンドの iptables 用プラグインである iptables-persistent パッケージをインストールする。
$ sudo apt install iptables-persistent依存で netfilter-persistent パッケージもインストールされる。
永続化用の netfilter-persistent コマンドは netfilter-persistent パッケージに含まれている。netfilter-persistent save で設定を永続化
netfilter-persistent save で現在の設定を永続化する。
$ sudo netfilter-persistent save run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save永続化される設定は /etc/iptables/ 以下にあるファイル rules.v4 と rules.v6 に保存される。
$ tree /etc/iptables/ /etc/iptables/ ├── rules.v4 └── rules.v6 0 directories, 2 filessudo reboot などで OS を再起動した後、設定を確認するとちゃんと復元されている。
iptables-persistent と netfilter-persistent の資料
README ファイルとマニュアルが用意されている。
$ cat /usr/share/doc/iptables-persistent/README netfilter-persistent and its plugins ------------------------------------ netfilter-persistent does no work on its own. You need the accompanying plugins (for example, iptables-persistent) to load and save filter rules. However, commands are run from netfilter-persistent. For example, to save all filter rules: netfilter-persistent save or to load them: netfilter-persistent start For more details, see `man netfilter-persistent`. The system service will try to load rules at startup if enabled, but by default it will not flush rules at shutdown. This behaviour can be changed by editing /etc/default/netfilter-persistent.Ubuntu Manpage: netfilter-persistent - load, flush and save netfilter rule sets
nmap でポートスキャン
他のマシンから nmap コマンドでポートスキャンして、iptables の設定が効いているか確認する。
いくつかのパターンでポートスキャンする。
XXX.XXX.XXX.XXX はターゲットのIPアドレス (IPv4)。
$ sudo nmap -Pn XXX.XXX.XXX.XXX Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-12 23:38 JST Nmap scan report for www.example.com (XXX.XXX.XXX.XXX) Host is up (0.020s latency). Not shown: 997 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp closed http 443/tcp closed https Nmap done: 1 IP address (1 host up) scanned in 4.59 secondsステルススキャン。
$ sudo nmap -sS -sU -Pn XXX.XXX.XXX.XXX Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-12 23:38 JST Nmap scan report for www.example.com (XXX.XXX.XXX.XXX) Host is up (0.023s latency). Not shown: 1000 open|filtered ports, 997 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp closed http 443/tcp closed https Nmap done: 1 IP address (1 host up) scanned in 10.63 secondsXXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX はターゲットのIPアドレス (IPv6)。
$ nmap -6 -Pn XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-12 23:46 JST Nmap scan report for wwww.v6.example.com (XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX) Host is up. All 1000 scanned ports on wwww.v6.example.com (XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX) are filtered Nmap done: 1 IP address (1 host up) scanned in 201.70 secondsステルススキャン。
$ sudo nmap -6 -sS -sU -Pn XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-12 23:52 JST Nmap scan report for wwww.v6.example.com (XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX) Host is up. All 2000 scanned ports on wwww.v6.example.com (XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX) are filtered (1000) or open|filtered (1000) Nmap done: 1 IP address (1 host up) scanned in 404.36 seconds参考資料
- IptablesHowTo - Community Help Wiki
- Ubuntu Manpage: iptables/ip6tables — IPv4/IPv6 のパケットフィルタと NAT の管理ツール
- Ubuntu Manpage: iptables-save — iptables ルールを標準出力にダンプする
- Ubuntu Manpage: iptables-restore — IP テーブルを復元する
- Ubuntu – eoan の iptables-persistent パッケージに関する詳細
- Ubuntu Manpage: netfilter-persistent - load, flush and save netfilter rule sets
- iptables-persistent / netfilter-persistent を理解する - j3iiifn’s blog