TORIPIYO DIARY

recent events, IoT, programming, security topics

所得税の計算方法(サラリーマン向け)

米株投資を始めて、ここ数年毎年確定申告をするようになり、以前よりも税金の仕組みに興味を持つようになりました。確定申告する時には、サラリーマンであれば国税庁の確定申告書等作成コーナーから源泉徴収票を元に金額を入力していけば申告用紙を作成出来るのですが、実際にどんな計算が内部でされているのか気になって調べてみました。

所得税の計算式

所得税は以下の計算式で求められます。所得税のしくみ|国税庁

所得税 = (収入金額 - 給与所得控除 - 所得控除) x 税率

以下、この計算式の各項目を説明します。

収入金額と給与所得控除

一般的なサラリーマンの場合、収入金額は会社から支払われる給与等の収入の総額、いわゆる年収となります。給与所得控除は、勤務に伴う必要経費です。会社が支給してくれるから必要な経費なんてないよと思う人もいるかもしれませんが、以下の表のように給与所得控除の額は収入金額ごとに設定されています。

平成29年分~令和元年分

給与等の収入金額
(給与所得の源泉徴収票の支払金額)
給与所得控除額
1,800,000円以下 収入金額×40%
650,000円に満たない場合には650,000円
1,800,000円超 3,600,000円以下 収入金額×30%+180,000円
3,600,000円超 6,600,000円以下 収入金額×20%+540,000円
6,600,000円超 10,000,000円以下 収入金額×10%+1,200,000円
10,000,000円超 2,200,000円(上限)

No.1410 給与所得控除|国税庁

ちなみに、この給与所得控除の計算方法は令和2年分以降から以下のように変更されるそうです。見てわかる通り、年収850万円以上の場合の控除額が減っています。850万円以下も控除額が10万円減っていると思うかもしれませんが、後で述べる所得控除の基礎控除(No.1199 基礎控除|国税庁)の額が38万円から48万円に変更となるのでプラス・マイナス0となりトータルの収入金額に対する控除額は変わりません。

令和2年分以降

給与等の収入金額
(給与所得の源泉徴収票の支払金額)
給与所得控除額
1,800,000円以下 収入金額×40%-100,000円
550,000円に満たない場合には、550,000円
1,800,000円超 3,600,000円以下 収入金額×30%+80,000円
3,600,000円超 6,600,000円以下 収入金額×20%+440,000円
6,600,000円超 8,500,000円以下 収入金額×10%+1,100,000円
8,500,000円超※ 1,950,000円(上限)

所得控除

所得控除は、控除の対象となる扶養親族が何人いるかなどの個人的な事情を加味して税負担を調整するもので、以下の種類があります。 所得税のしくみ|国税庁 所得金額から差し引かれる金額(所得控除)|国税庁

  1. 雑損控除
  2. 医療費控除
  3. 社会保険料控除
  4. 小規模企業共済等掛金控除
  5. 生命保険料控除
  6. 地震保険料控除
  7. 寄附金控除
  8. 障害者控除
  9. 寡婦控除・寡夫控除
  10. 勤労学生控除
  11. 配偶者控除
  12. 配偶者特別控除
  13. 扶養控除
  14. 基礎控除

最近話題のふるさと納税は「寄付金控除」、iDecoは「小規模企業共済等掛金控除」に入ります。会社の給料明細に記載されている厚生年金、健康保険、雇用保険は「社会保険料控除」に入ります。

厚生年金は月収や賞与に応じてその額が定められています。例えば、月収40万円の人は、等級では24となり、厚生年金の半分は会社が払ってくれるので本人の支払う厚生年金は37515円です。

https://www.nenkin.go.jp/service/kounen/hokenryo/ryogaku/ryogakuhyo/20200825.files/1.pdf

所得税の税率

所得税の税率は課税所得金額によって異なります。課税所得金額は、

課税所得金額 = 収入金額 - 給与所得控除 - 所得控除

となります。課税所得金額に対して、以下の所得税の税率を掛け算することで所得税の金額が算出されます。 No.2260 所得税の税率|所得税|国税庁

所得税 = 課税所得金額 x 税率

課税される所得金額 税率 控除額
195万円以下 5% 0円
195万円を超え 330万円以下 10% 97,500円
330万円を超え 695万円以下 20% 427,500円
695万円を超え 900万円以下 23% 636,000円
900万円を超え 1,800万円以下 33% 1,536,000円
1,800万円を超え4,000万円以下 40% 2,796,000円
4,000万円超 45% 4,796,000円

課税所得金額の計算式を見てわかる通り、所得税の税率は収入金額に対して適用されるわけではありません。課税所得金額に対して適用されます。 ということは、自分の収入は600万円だから、20%の課税となるわけではありません。課税所得金額を計算して、はじめて自分の所得税の税率がわかるわけです。サラリーマンで課税所得金額が695万円を超えて税率23%になる場合は、かなりの高収入ということになります。

課税所得金額が400万円の場合、税率は20%で控除額は42.75万円なので、所得税は以下のようになります。

400 x 0.20 - 42.75 = 37.25万円

なぜ、42.75万円を引くのかというと、課税所得金額のうち最初の195万円は5%の税率、195万円~330万円は10%の税率、330万円~695万円は20%の税率と計算されるので、5%の税率のものと10%の税率の分を引いているからです。

ですので、課税所得金額が400万円の時の所得税は以下のようにも計算できます。

195 x 0.05 + (330 - 195) x 0.10 + (400 - 330) x 0.20 = 9.75 + 13.5 + 14 = 37.25万円

税額控除と基準所得税

課税所得税に対して、所得税の税率を適用すれば所得税額を計算できますが、これがそのまま税務署に納める額となる人もいれば、所得税額からさらに控除出来る人もいます。

No.1200 税額控除|所得税|国税庁

基準所得税 = 所得税 - 税額控除

サラリーマンの場合であれば、外国株の配当による外国税額控除(米国株の配当はこれに該当)、基準を満たしたマンションの購入による住宅借入金等特別控除などで差し引ける場合があります。この税額控除は確定申告をしないと受けることが出来ないようです。税額控除は、所得税から直接引かれるので、控除のインパクトは所得控除よりも大きいです。所得税額から税額控除を差し引いた後の所得税額を、基準所得税額というそうです。

所得税の計算例

ここまでの内容を元に、所得税がどのくらいになるのか、年収別に計算してみたいと思います。ここでは、話を単純化するために全ての例で、納税者は30歳の独身、職場の所在地は東京都、生命保険や地震保険への加入無し、給与は毎月均等払いで賞与は無しとして、所得控除は必要最低限のものとなるようにします。大半の人はここで出す例よりも所得控除の額は大きくなって、所得税額はもっと小さくなるはずです。所得税の計算は年によって変わるので令和元年のもので計算します。

年収400万円の所得税

年収600万円の所得税

年収800万円の所得税

結果を見ていけばわかる通り、所得税の収入金額に占める割合(%)は、収入が増えるごとに高くなります。年収800万円の人は年収400万円の人と比べて、収入では2倍ですが、所得税では5倍以上を支払っています。 税務署の立場から見ると、800万円の人から確実に税金を徴収するほうが、400万円の人から税金を徴収するよりも5倍以上効率的に所得税を徴収できる形になります。より年収が高くなると、収入に占める所得税の割合はより高くなり、高収入の人からはより効率的に税金を徴収できるようになるというわけです。また、現在は東日本大震災からの復興のための施策を実施するために基準所得税額に対して2.1%の復興特別所得税が導入されています。

個人の方に係る復興特別所得税のあらまし|国税庁

この復興特別所得税2037年まで徴収が続くそうです。

住民税の計算方法はこちら

toripiyo.hatenablog.com

リモートワークの気分転換にホテルに泊まって家まで自転車で帰ってみる

f:id:ha107chan:20200530111311j:plain

前回、リモートワークで気分転換にホテルに泊まってから早3ヶ月。

toripiyo.hatenablog.com

緊急事態宣言も解除され、前回泊まったドーミーイン川崎から神奈川県の人限定で割安に泊まれるプランのメルマガ案内を受けたのでまた泊まってきました。

f:id:ha107chan:20200529220038j:plain
相変わらず一人で泊まるなら十分なスペース

前回は、夜ごはんは外で食べたのですが、今回はやる事があったので外には食べに行かず、代わりにubereatsを使ってみました。ビジネスホテルでもubereatsは運んでくれるんですね。さすがに部屋までは外部の人は来れないので、ホテルの玄関で待ち合わせて受け取りました。このホテルはセブンイレブンとも直結なのでちょっとビールなど飲み物を買いに行くのに便利です。

f:id:ha107chan:20200529194814j:plain
あまり食べたことのない世界の山ちゃん

前回は食べなかった夜鳴きそばを今回は食べました。そばはハーフサイズと聞いていたのですが、ダブルサイズにも出来るようでダブルサイズにしている人も結構いました。

f:id:ha107chan:20200529221622j:plain
これはハーフサイズの夜鳴きそば

今回ミスしたのが寝る時間。温泉に入って、夜1時30分ぐらいまで漫画を読んでいたらうまく寝付けなくなり、目が覚めたら朝の9時、、、。朝ごはんのラストオーダーが8時45分なので朝食を食べ損ねてしまいました。。。ドーミーイン のカーテンの遮光性は抜群なので、朝の光で目覚めたい人は少しカーテン開けた方がいいかもしれません。

今回は、出来るだけ密集を避けるのと運動を兼ねて、帰りは電車ではなくて自転車で家まで帰りました。hello cyclingというサービスを使います。

www.hellocycling.jp

このhello cyclingというレンタル自転車のサービスは、多摩川沿いなどでたくさん見かけることができます。スマホのアプリから予約して、近くのセブンイレブンまで行きます。Kyashカードでも支払いができました。自転車を予約するといきなり2000円引かれたのでびっくりしましたが、これはちゃんと決済の利用できるクレジットカードかどうか確認するためにしているようです。自転車を返却した時に引かれた2000円が戻ってきていました。

f:id:ha107chan:20200530105522j:plain
こんな感じでセブンイレブンにおいてある

乗り始めて最初は電動機能があることに気づかなかったのですが、以下の写真のようにパネルから電源を入れると電動アシスト機能が有効になって坂道でも座ったまま快適に自転車を漕ぐことができます。

f:id:ha107chan:20200530110219j:plain
電動機能のパネル

自転車を借りて5分ぐらい漕ぐとすぐ多摩川の河川沿いのコースに行けます。

f:id:ha107chan:20200530111516j:plain
こんなゴルフ練習場があるとは知らなかった

f:id:ha107chan:20200530112336j:plain
左側のビル群は武蔵小杉の高層マンションたち

朝ごはんを抜いてしまったので途中で寄り道して、新丸子駅近くのらーめん喜輪でお昼ごはんを食べました。

f:id:ha107chan:20200530120630j:plain
家系らーめんはやっぱり美味しい

らーめん 喜輪 (㐂輪/kirin) - 新丸子/ラーメン [食べログ]

自転車のレンタル料は、15分で70円。途中でらーめん食べたりしたので、2時間使って560円でした。多摩川沿いを走る電車ってあまりないので多摩川を沿った移動をしたい人にはけっこう需要はあるのかもしれないですね。自分が家に向かって帰っている間にも、hello cyclingを利用している人を何人も見かけました。僕もよく多摩川走るので、片道は走って帰りは自転車という使い方も面白そうだなと思いました。

AWS環境にAmazon Linux 2でOpenVPNサーバを構築・運用する

以前、AWS環境にOpenVPNサーバを構築して運用する記事を書きました。

toripiyo.hatenablog.com

この記事は、Amazon Linuxでの構築を前提に書かれているのですが、いまはAmazon Linux 2が主流となっています。そこで、Amazon Linuxから、Amazon Linux 2向けに記事を書き直してみました。

目次

どんな方式でVPNサーバを構築するか

以下記事の通り、VPN通信を実現するには様々な方法(PPTP, L2TP/IPsec, SSTP, IKEv2, )があります。

proprivacy.com

今回も以前の記事と同じように、TLSを利用したOpenVPNの証明書認証方式でVPNサーバを構築します。

VPNの認証方式を証明書認証にすることで、ユーザごと個別に証明書を有効・無効にしてアクセスの許可・拒否を設定出来ます。 パスワード認証の方が設定は楽ですが、退職者が出るたびに新しいパスワードを設定して、VPN利用者全員にパスワードの更新を周知する手間が生じるので、長期的に見れば証明書認証の方が運用は楽になります。

AWSVPC上にVPNサーバを構築することで、以下のようなケースで利用できるようになります。

  • EC2とのSSH通信をVPNサーバ経由でネットワークを閉じて出来るようになるので、SSH通信をしたいサーバにパブリックIPを付与する必要がなくなります。SSHの入り口を外部から無くせるので、外部からの脅威を軽減できます。
  • AWS上に構築した社内向けWEBアプリを、プライベートIPのみの閉じたネットワークで公開出来るようになります。パブリックIPを持たないので外部から社内ツールに侵入される脅威を軽減できます。(もちろん、たとえ閉じたネットワークでも認証・権限管理、監査機能をアプリ側にちゃんと実装する方が安心です。)

構築手順

構成図

以下のネットワーク構成を想定して、VPNサーバを構築します。

f:id:ha107chan:20200514211321p:plain
VPNネットワーク構成図

  • 複数のVPCがあるのであれば、別途VPC Peeringを設定することで、VPNサーバの置かれたVPCとは異なるVPC上のサーバとも通信が出来ます。
  • VPNを経由してインターネットに接続するようにしたい場合は、VPNサーバの所属するsubnetのルートテーブルにインターネットゲートウェイなどを設定して、外部通信できるようにしておいてください。

AWSの設定

セキュリティグループの作成

VPNサーバにアタッチするセキュリティグループを作成します。セキュリティグループの名前は自分の好きな名前で大丈夫です。

セキュリティグループのInboundルールに、

  • UDP:1194 PORT:0.0.0.0/0(openvpnの通信に利用、全てのIPからのアクセスを許可、特定のIPのみからしVPNを利用しないのであればIPの絞り込み可能。)
  • TCP:22 PORT:自分のIPアドレス(自分のIPからのアクセスを許可、VPNサーバの作成後は削除可能)

を設定してください。

ElasticIPの用意

VPNサーバのグローバルIPアドレスを固定するために、AWSコンソールからElasticIPをVPNサーバにアタッチします。 ElasticIPをVPNサーバに紐付けなくてもVPNサーバは構築出来るのですが、サーバを再起動する度にIPアドレスが変わると、VPN利用者に新しいIPを共有し直す、もしくはDNSレコードの設定を変える必要があるので、後々の運用を考えて最初から固定IPにしたほうが楽になります。

VPNサーバの構築

Amazon Linux 2でVPNサーバを構築します。Amazon Linux 2の最新版のAMIを利用します。 10人以下の利用であれば、VPNサーバの負荷は小さい場合がほとんどなので、インスタンスタイプは低いものでも大丈夫です。今回は、t3.microで構築をしました。

サーバの基本設定

Amazon Linuxを起動したら、下準備として以下の設定をします。

日本時間の設定

sudo timedatectl set-timezone Asia/Tokyo

IPパケット転送の有効化

Linuxはデフォルトではパケットの転送を許可していないので、Linuxサーバ上のあるネットワークインターフェースから別のネットワークインターフェースに向けてIPパケットの転送を有効化するために、以下のカーネルパラメータ設定を行います。

sudo sh -c "echo -e '\nnet.ipv4.ip_forward = 1' >> /etc/sysctl.conf"
# load /etc/sysctl.conf settings
sudo sysctl -p

www.ducea.com serverfault.com

iptablesによるマスカレードの有効化

iptablesで、natテーブルのPOSTROUTINGチェインに対して、VPNの仮想ネットワークIPレンジ(10.8.0.0/24)から、eth0インターフェースに対して来たパケットを、マスカレードするように設定追加します。サーバの再起動後もこのiptables設定が有効となるように、iptables-restore < /etc/sysconfig/iptables の文字列を /etc/rc.localのファイルに追加します。

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo iptables-save | sudo tee /etc/sysconfig/iptables
sudo chmod +x /etc/rc.d/rc.local
echo 'iptables-restore < /etc/sysconfig/iptables' | sudo tee -a /etc/rc.local

認証局(Certificate Authority)の構築

今回作るOpenVPNのサーバでは、インスタンスの稼働台数が減らせるので、認証局(CAサーバ)の機能とVPNの機能を同じEC2インスタンスに構築します。 本格的に運用するのであれば、CA(Certificate Authority)サーバとOpenVPNサーバは分離させた方がセキュリティ的にはより安全になります。

分離させておくことで、

  • OpenVPNサーバの台数を増やして冗長化させたいときに、認証局周りの設定をOpenVPNサーバを増やした時にどうするか考える手間を減らせます。
  • 認証局サーバを外部からアクセス出来ないように分離しておくことで、認証局秘密鍵(ca.key)が漏洩するリスクを減らすことが出来ます。

Amazon Linux 2ではインストールされるeasy-rsaのパッケージバージョンが上がっており、以前の記事で書いたAmazon Linuxの場合とは実行するコマンドが変わっています。

easy-rsaのインストール

# epelレポジトリからRSA鍵を管理するeasy-rsaパッケージをインストール
sudo amazon-linux-extras install epel
sudo yum install easy-rsa

認証局の作成

# PKI(public key infrastructure)のディレクトリ(pki)階層を作成
sudo /usr/share/easy-rsa/3/easyrsa init-pki

# 認証局の秘密鍵・証明書を作成する、今回はnopassを指定して秘密鍵にはパスフレーズを設定しない、セキュリティ面では設定をしたほうがいい
sudo /usr/share/easy-rsa/3/easyrsa build-ca nopass
## ex. Common Name (eg: your user, host, or server name) [Easy-RSA CA]:toripiyo CA

# Diffe-Hellman パラメータを生成(実行が終了するまで数分かかる)
sudo /usr/share/easy-rsa/3/easyrsa gen-dh

# CRL(証明書執行リスト)を作成
sudo /usr/share/easy-rsa/3/easyrsa gen-crl

VPNサーバの証明書作成

VPNサーバの証明書と秘密鍵の作成

sudo /usr/share/easy-rsa/3/easyrsa build-server-full server nopass

クライアントの証明書作成

OpenVPNサーバを利用するクライアントの証明書作成をします。

# 証明書の期限を365日に設定してtorippyという名前でクライアント証明書と秘密鍵を作成
# 今回の場合は、nopassを指定して秘密鍵にパスフレーズを設定していないが、クライアント証明書が漏洩した時に利用されにくいようにパスフレーズは設定しておいたほうが良い
sudo /usr/share/easy-rsa/3/easyrsa --days=365 build-client-full torippy nopass

# pki ディレクトリをホームディレクトリの配下から/usr/share/easy-rsa/3の配下に移動させる
sudo mv ~/pki /usr/share/easy-rsa/3

OpenVPNサーバの構築

"認証局(Certificate Authority)の構築"で、OpenVPNを利用するのに必要なCA, サーバ, クライアントの秘密鍵・証明書を作成しました。今度は、OpenVPNサーバの設定をします。

OpenVPNのインストール

sudo yum install openvpn

ta.keyの作成

cd /etc/openvpn
sudo openvpn --genkey --secret ta.key

crl.pemを/etc/openvpnに配置

sudo cp /usr/share/easy-rsa/3/pki/crl.pem /etc/openvpn
sudo chmod +r /etc/openvpn/crl.pem

OpenVPNの設定

以下の内容で、設定ファイルを配置します。

sudo vi /etc/openvpn/server.conf
=====================================================
port 1194
proto udp
dev tun # use virtul point-to-point IP link device
user nobody
group nobody
ca /usr/share/easy-rsa/3/pki/ca.crt # CA certificate
cert /usr/share/easy-rsa/3/pki/issued/server.crt # OpenVPN server certificate
key /usr/share/easy-rsa/3/pki/private/server.key # OpenVPN private key
dh /usr/share/easy-rsa/3/pki/dh.pem # DH parameters file
crl-verify /etc/openvpn/crl.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt # keep same IP address
# push "redirect-gateway def1" # all traffic goes through vpn server
# push "dhcp-option DNS 172.31.0.2" # use internal DNS resolver
push "route 172.31.0.0 255.255.0.0" # vpc private ip range
keepalive 10 120
cipher AES-256-GCM
max-clients 20
persist-key
persist-tun
tls-crypt /etc/openvpn/ta.key
status openvpn-status.log
log-append  /var/log/openvpn.log
verb 3
=================================================================

server.confの設定ファイルの内容に関する、いくつかの項目を説明します。

  • dev tun: tun仮想ネットワークデバイスを設定する。tunは、IPv4/IPv6OSIレイヤー3で動作してルーターのように働く。vpnのクライアントは、サーバ側のサブネット(10.1.0.0/255.255.0.0)には参加しないで、vpn独自のサブネット(10.8.0.0/255.255.255.0)からipを割り当てられる。dev tapの場合は、サブネットを分けなくても済むようになるが、サブネットが分かれていないのでクライアントからサーバへのアクセスのIP制限を設定したい時にはtunよりもやりにくくなる。
  • user nobody, group nobody: openvpnは、初期化後はroot権限がなくても動作するようにデザインされているので、nobody ユーザ・グループ権限で動かすようにしている。
  • dh: diffie hellmanパラメータの値をもつファイル。
  • server: VPNネットワークのサブネットを設定する。クライアントはserverで指定しているIPレンジからVPN接続用のIPを割り当てられる。
  • push "redirect-gateway def1": このディレクティブを有効化させると、openvpnに接続するクライアントのデフォルトゲートウェイVPNを経由するように設定できる。つまり、ウェブサイトの閲覧時に全てのトラフィックVPN経由に設定できるようになる、ただし、VPNサーバ側ではNATの設定などをしておかないと正しく動作しない可能性がある。
  • push "dhcp-option DNS": VPNに接続した際に利用するDNSサーバを指定する。AWSの内部DNSサーバのIPを指定すれば、内部DNSレコードを引くようにすることもできる。
  • push "route": VPNの先にあるネットワークと通信したい時にそのネットワークのIPレンジを指定。上の設定例では、AWS内部のVPCネットワーク内のインスタンスとクライアントが通信出来るように、VPCのIPレンジの10.1.0.0を指定している。
  • tls-crypt: あまり深くは把握してないのですが、この鍵情報をサーバとクライアントで事前に共有しておくことで、TLS通信をする際にclient helloの段階から暗号化出来るそうです。暗号化することで、openvpnプロトコルの通信をしていることを検知出来ないようにしたり、TLS DOS攻撃の抑制を出来るようになるそうです。serverfault.com

OpenVPNの起動と自動起動の有効化

sudo systemctl start openvpn@server
sudo systemctl status openvpn@server
sudo systemctl enable openvpn@server

サーバ再起動

サーバを再起動してもopenvpnは正常に稼働するかどうか確認するためにサーバを再起動

sudo reboot

これで、OpenVPNサーバが起動出来ました。次は、クライアントに配布するOVPNファイルをopenvpnサーバ上で作成します。

OVPNファイルの作成

OpenVPNサーバにVPN接続するために、VPNを利用するクライアントは、以下の情報が必要になります。

  • OpenVPNサーバに接続するための設定情報
  • OpenVPNサーバの証明書情報
  • クライアントの証明書
  • クライアントの秘密鍵
  • OpenVPNサーバのStatic Key

これらの情報をそれぞれ別ファイルで作成すると、VPNを利用するクライアントは合計5個のファイルを管理する必要があります。これでは、管理が大変なので、ovpnという拡張子を持つ1個のファイルにまとめます。

ovpnファイルは、以下の手順で作成できます。この例では、torippyというクライアント名のovpnファイルを作成しています。

client_name="torippy"
vpn_server_ip="vpn serverのグローバルip"

cat > ${client_name}.ovpn << EOF
client
dev tun
proto udp
remote ${vpn_server_ip}
port 1194
cipher AES-256-GCM
resolv-retry infinite
nobind
persist-key
persist-tun
ca [inline]
cert [inline]
key [inline]
tls-crypt [inline]
verb 1
keepalive 10 120
remote-cert-tls server
<ca>
`sudo cat /usr/share/easy-rsa/3/pki/ca.crt`
</ca>
<cert>
`sudo cat /usr/share/easy-rsa/3/pki/issued/${client_name}.crt`
</cert>
<key>
`sudo cat /usr/share/easy-rsa/3/pki/private/${client_name}.key`
</key>
<tls-crypt>
`sudo cat /etc/openvpn/ta.key`
</tls-crypt>
EOF

作成したovpnファイルを、openvpnを利用するクライアントユーザに安全な方法を経由して渡します。このovpnファイルが第3者に渡ってしまうとその第3者によってVPNを利用されてしまうので漏れないように気をつける必要があります。万一漏洩しても被害を少なく出来るように、クライアントの証明書作成の際にパスフレーズを設定しておくと、パスフレーズを正しく入力しないとVPNサーバに接続出来ないので、設定しておくほうがセキュリティ的には安心です。

VPNを利用するユーザは、渡されたovpnファイルを利用してVPNに接続します。MacでTunnelblickを利用する場合は、以下の手順となります。

  • tunnelbrickをインストール brew cask install bunnelbrick
  • tunnelbrickを起動する
  • ovpnファイルを画面右上のtunnelbrickのアイコンにドラッグアンドドロップする
  • 表示されてきたプロンプト画面でOnly Meをクリックする
  • Macのパスワード入力を求められるので入力する。証明書のパスフレーズも求められるので入力する。これでVPNサーバとクライアントでコネクションを貼れるようになる。

運用手順

新しいクライアントの追加

  • minckyというクライアントを追加して、そのクライアントのovpnファイルを作成する。(秘密鍵パスフレーズを設定する場合は、nopassのオプションを外す)
  • minckyのovpnファイルの作成方法は、torippyの場合と同様
client_name='mincky'

cd /usr/share/easy-rsa/3
sudo /usr/share/easy-rsa/3/easyrsa --days=365 build-client-full ${client_name} nopass

既存クライアントの証明書失効

  • 退職などに伴って、発行済の証明書からVPNサーバに接続出来なくなるようにする。
client_name='mincky'

cd /usr/share/easy-rsa/3
sudo /usr/share/easy-rsa/3/easyrsa revoke ${client_name}

# /etc/openvpn/crl.pem を更新する
sudo /usr/share/easy-rsa/3/easyrsa gen-crl
sudo cp /usr/share/easy-rsa/3/pki/crl.pem /etc/openvpn

# このコマンドは、すでに上書きするcrl.pemファイルに読み込み権限があれば不要
# nobodyユーザから読み込める権限であれば、openvpnの再起動は不要
# クライアント接続時に、openvpnは、crl.pemファイルを読み込んで失効している証明書リストを確認
sudo chmod +r /etc/openvpn/crl.pem

ShellScriptを使ってElasticsearchから10000件以上のデータを取得する方法

Elasticsearchには1度のクエリーで取得できるドキュメントの数に制限があり、通常は1度で10000件まで取得することができます。

stackoverflow.com

10000件以上のドキュメントを取得したい場合はScrollを利用します。

www.elastic.co

Scrollを利用すると、サーバへの1回目のリクエストでは、クエリをボディにセットして投げますが、2度目以降は前のリクエストの応答で取得したscroll_idを用いて、データを取得します。

1回目のリクエス

  • scrollパラメータで、search contextをどれぐらいの期間有効化しておくのか指定します。search contextに指定する値は全てのデータを取得するまでに要する時間を指定しなくて大丈夫です。リクエストを投げる度に、そのリクエストに設定されたscrollパラメータの有効期間が更新されるので、前のリクエストを投げてデータを処理してから次のリクエストを投げるまでの間隔よりも長くなるように指定すれば十分です。大半のケースでは、scroll=1mの指定で十分だと思われます。
POST /twitter/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

2回目以降のリクエス

  • 1回目のリクエストのサーバからの応答で、scroll_idというパラメータを取得する事ができます。2回目以降のリクエストでは、その前の応答で取得したscroll_idの値をリクエストボディに設定する事で、10000件以上のドキュメントを順番に取得していく事ができます。
POST /_search/scroll
{
    "scroll" : "1m",
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

このように、scroll_idを継続的にリクエスト中に投げることで、10000件以上のドキュメントの場合でも取得することが出来ます。

このやり方にならって、Elasticsearchから10000件以上のデータを取得する操作を、シェルスクリプトにすると次のようになります。

  • query.json
    • elastisearchに投げるクエリーを記述
  • search.sh
    • 特定のindexからのみ検索する場合は、index変数を設定
    • TODO processというコメントの箇所に抽出したデータをどうやって処理するのか記載。このsearch.shでは、result.jsonというファイルの中に応答データをそのまま書き込んでいる。

このシェルスクリプトを利用すれば、scrollを使ってElasticsearchで10000件以上のデータを取得することが出来ます。MySQLなどと違って、ちょっと工夫が必要ですね。

IoT物理ボタンのswitchbotを使って換気扇操作をタイマー式にする

うちのマンションのお風呂の換気扇にはタイマー機能はありません。だいたい寝る直前にお風呂に入って出た後に換気扇を回すのですが、この換気扇を止めるタスクがいつも煩わしく感じていました。 ベッドに入る前に換気扇を止めると、まだ湿気が抜けない。ベッドに入ってしばらく経ってから換気扇を止めに行くと目が覚める。朝まで換気扇を回していると電気代が勿体無い。そこで、この悩みを解決するためにIoT物理ボタンのswitchbotを購入しました。

switchbotは、家電製品などのスイッチをbluetoothを使って、物理的にオン・オフ出来るようにするIoT製品です。 これをお風呂の換気扇のスイッチに取り付けると、スマホから換気扇をオン・オフが出来るようになりました。取り出してすぐに使えて、プログラミングの知識は必要ありません。 うちの換気扇は、コスモワイド埋込型というタイプのスイッチですが、付属のシールを使えば問題なく動きます。


switchbotでお風呂の換気扇を操作する

動画には映っていませんが、iPhoneのアプリを利用してswitchbotを動かしています。 switchbotはapple watchでも動かすことが出来るのですが、iPhoneがswitchbotとapple watchを中継する役割をしているようで、iPhonebluetoothでswitchbotを認識しているときしか動きません。つまり、apple watch単体ではswitchbotを動かせないので、apple watchをつけてお風呂に入っている時に、換気扇をオン・オフしようとしても近くにiPhoneがなければ動きません。

switchbotのiphoneアプリを利用すると、動作時刻を指定することが出来ます。例えば、深夜2:00に換気扇を止めるようにswitchbotを設定といったことが出来ます。これは換気扇の操作のためにあるような機能ですね。

f:id:ha107chan:20200331230800p:plain
午前2時に動作するように設定

惜しいのは、いまから何分後という指定は出来ないみたいなので、指定したい時刻が異なる場合はその度に新しい時刻設定を追加する必要があるということです。ここは、アプリのアップデートで機能追加して欲しい。

Google Homeなどのスマートスピーカーから操作する場合は、別売りのSwitchBot Hub Plus/Hub Miniを購入しないと動かないようです。

APIがあるようなので、ラズパイをいじってプログラミング出来る人であれば、ラズパイと連携してスマートスピーカー から操作できるように設定出来るかもしれません。

rcmdnk.com

スマートスピーカー との連携にはHubが必要なのは残念ですが、それでもこれで換気扇を気にせずに眠れるようになったのでだいぶ楽になりました。また時間が取れたら、APIをいじってラズパイとスマートスピーカーの連携が出来ないか試してみたいと思います。

Ruby Gemのoctokitを利用してGitHub Issueを作成する

仕事でGitHub Issueを作成するRubyプログラムを書く機会があったので、必要最小限の要素だけ取り出したものをまとめてみます。

GitHub用のアクセストークンの発行

RubyプログラムからGitHub Issueを作成するには、まずGitHubのサイトから、アクセストークンを取得する必要があります。アクセストークンの取得方法は、いろんなサイトで公開されているので、適当なものを参照してください。

help.github.com

アクセストークンに付与する権限ですが、Issueを発行する権限がどれになるのかいまいちよく分からなかったのですが、repo Full control of private repositories にチェックを入れてアクセストークンを発行すれば、プライベートレポジトリでもIssueを作成することが出来ました。特定のレポジトリだけにこの権限を絞り込む方法も調べてみたのですが、調べた限りではよくわかりませんでした。

f:id:ha107chan:20200329112918p:plain
access token authorization sample

このアクセストークンは、GitHubの操作のための鍵となる情報なので、秘密にしておかないといけません。外部への公開は絶対してはいけません。

octokit gemのインストール

octokit gemをインストールします。octokitは、GitHub APIに繋ぐためのクライアントツールです。

gem install octokit

github.com

GitHub Issueを発行するプログラムを作成

以下は、jsonファイル(data.json)からデータを読み込んで、その読み込んだデータを利用してGitHub Issueを発行するスクリプトの例です。

  • access_token には、自分のアクセストークン値を代入
  • repo_name には、Issueを紐づけたいレポジトリ名を代入
  • ヒアドキュメントを利用して、チケットのbody(本文)に挿入する文字列を作成
  • "Greeting Message"というラベルを挿入

Rubyスクリプトの実行

これで、以下のように作成したRubyスクリプトを実行すれば、

ruby create_github_issue_sample.rb

自分の好きなレポジトリに、GitHubチケットを作成できます。

f:id:ha107chan:20200329113009p:plain
ticket sample

米株の外国税額控除とふるさと納税の確定申告

2年ほど前からアメリカ株の取引をしていて、配当を受けるときに引かれる現地課税とふるさと納税のために、毎年確定申告をしています。

確定申告の方法

確定申告をするときはいつも国税庁確定申告書等作成コーナーのページから、必要な情報を入力して作成した確定申告書を印刷して、必要な書類と一緒に税務署まで持って行きます。

www.keisan.nta.go.jp Macだと正しく動かないのではないかと思うかもしれませんが、意外にも、Macsafariでも確定申告書を作成することが出来ます。 普通の会社員の場合は、所得税及び復興特別所得税の確定申告書作成コーナーから作成します。

ふるさと納税

"収入金額・所得金額入力"に収入の情報を入力して、"所得控除入力"のところで、"寄附金控除"の項目からふるさと納税の金額を入力します。 ふるさと納税の項目では、以下の画像のように入力をします。合計額をまとめて入力してもよいと説明が記載されていたので、画像のように寄付金額をまとめました。

f:id:ha107chan:20200328145456p:plain
ふるさと納税

米株の外国税額控除

"税額控除・その他の項目の入力"の"外国税額控除"の項目から外国所得税の額を入力します。自分は楽天証券の特定口座(源泉徴収あり)を利用して株を売買しているのですが、楽天証券の場合はサイトにログインして"特定口座年間取引報告書"というpdfファイルを開いて、1ページ目の"外国所得税の額"の項目を見ればどれだけ米株の配当に対して現地課税がされたのか分かります。この"外国所得税の額"に記載された金額を、以下の画像のように入力します。

f:id:ha107chan:20200328145527p:plain
国税額控除

(一応、これで還付は問題なく受けられたのですが、本当は、以下のブログのように、外国税額控除の計算がお済みでない方のほうで入力するのが正しいような気もします。。。ちょっとぐらい間違っていても、税務署の方でこれぐらいはいい感じに処理してくれるのかもしれないですが、このやり方を真似する場合は自己責任で。)

www.kuzyofire.com

これで、ふるさと納税と米株の外国税額控除の入力が完了しました。税務署には、国税庁確定申告書等作成コーナーのページから作成して確定申告書の紙と、各自治体から送られてきたふるさと納税の寄附金受領証明書、楽天証券の特定口座年間取引報告書を印刷したものを持っていって提出すれば確定申告を完了出来ます。郵送だと心配だからいつも税務署まで直接持参していたのですが、書類に不備があった場合は電話で連絡してくれると教えてもらったので、来年からは税務署に郵送で送るかもしれません。

二週間ほど前に、無事に還付金が税務署から振り込まれていました。確定申告をすると、自分が税金を払っているという実感が持てて、申告方法を調べる中で前よりも税金に詳しくなるのでふるさと納税などやっている人は1度確定申告してみても良いかもしれません。

参考