しろログ

日々巡り会ったものの感想・レビュー

アプリの公開に伴う年次自己番号分類報告の提出について

※筆者は法律の専門家でもなんでもないので、本記事は自己責任でご参照ください。
また、各種フォーマットやルールは適宜変更される可能性がありますので、ご注意ください。

App Storeでアプリを審査に提出する時、暗号化云々を聞かれると思います。
ここ、うやむやにしてる人も多いかと思いますが、アプリ内でATSやHTTPSを使用している場合には、暗号化処理を含んでいるものとして扱われるようです。

独自にファイルを暗号化している場合はもちろん、httpsでAPIを叩いていたり、Firebase(アクセス解析等)やAdMob(広告配信)などサードパーティ製のSDKもhttps通信をしているので、こういったSDKを含んだアプリも該当します。

これらのアプリをApp Storeなどで公開する場合、それらは「アメリカ(のサーバー/サービス)から配信されている」=「アメリカから輸出されている」ということになるので、アプリが日本向けオンリーでも、アメリカからの輸出品となるようです。
(同じ理屈でApp Storeに限らずGoogle Playなどで配信するAndroidアプリも同様です)

そのため、暗号化を含んだ商品を輸出するのであれば、輸出した年度内に自己番号分類報告を提出してくださいね、というのが促されているわけです。
(ちなみにApp Storeでの暗号化の有無についての回答は、特にアメリカ当局に提出されているとかではないようです)

以下、アプリを自分自身が日本で作成し、アプリ内で単純なhttps通信をしている場合を想定したレポート提出の例です。

具体的に何をすべきかと言うと、
・決められたフォーマットのCSVファイルを作成して
・公開した年の次の年の2月1日までに
・ crypt-supp8@bis.doc.gov と enc@nsa.gov 宛てのメールに添付して提出する
だけです。
変更が無くても毎年行うようです。

この辺は、
年次自己番号分類報告の提出方法
が参考になります。

CSVの中身は、

PRODUCT NAME,
MODEL NUMBER,
MANUFACTURER,
ECCN,
AUTHORIZATION TYPE,
ITEM TYPE,
SUBMITTER NAME,
TELEPHONE NUMBER,
E-MAIL ADDRESS,
MAILING ADDRESS,
NON-U.S. COMPONENTS,
NON-U.S. MANUFACTURING LOCATIONS

(便宜上カンマの後を改行してます)
となっていて、

(アプリ名),
(App StoreのSKU),
SELF,
5D992,
MMKT,
Mobility and mobile applications n.e.s.,
(あなたの名前),
(あなたの電話番号),
(あなたのメールアドレス),
(あなたの郵便番号・住所),
NO,
(制作場所 例:Tokyo Japan)

を、アプリの数だけ入力すれば良いようです。カッコ部分を自分用に書き換えます。

回答例は
BIS Year-End Self Classification Report
を参考にしました。

記事ではECCNを 5D992.c としていますが、

Part742 付則8

の(a)(4)によると 5A002, 5B002, 5D002, 5A992, 5D992 から一つ選べ、となっているので、 .c は取ってみました。

ちなみにこの英数字の一つ一つに意味があるので、気になったら調べてみましょう。
5D002ではなく5D992なのは配布方法によるものとかなんとか・・

まあ、このレポートも今の所は提出しなくても罰則とか無いようですが、なんとなくきっちりしたい、という場合には出しておきましょう。
(いや本来出さないといけないんですが)

※とんでもない間違いをしてるというのがあったら info@hakoniwa.net までご一報いただければ幸いです。

■参考
How to file an Annual Self Classification Report (英語)
BIS本家。ここのページでレポートのサンプルをDLできます。

米国の輸出規制
米国の輸出規制の和訳。とても役に立つ。

スマホアプリと米国輸出規制に関するメモ
2014年の記事なのでちょっと古いけど、細かく書いてある。

群衆の英知もしくは狂気

群衆の英知もしくは狂気

群衆の英知もしくは狂気

人々のネットワークと、思考・判断・行為の伝搬、印象、集団浅慮(集団思考)など、群衆の動きについて、閲覧者(あなた)の操作を通じて分かりやすく表現しているインタラクティブサイト。

形成されるネットワーク次第で、例えば飲酒する人が実際よりも多くいるように思えるなどのメカニズムを知ることができます。

特に深く強すぎるネットワークが害悪になる(集団思考)というのが、言われてみればその通りなのですが、盲点でした。

身近なネットワークであるところの、会社や団体などの組織で言えば、そもそも単一の目的や理念を共有するところからスタートしているので、常に集団思考に陥りがちだということを認識すべきだなぁと。

自分一人が何かしても世界は変わらない。
けれども、その行為は確実に自分のネットワークを通じて人々に影響を及ぼすという観点で、意味のあることなんだと。

そんな気になるサイト(作品)。

箱庭リバーシ

リバーシ(オセロ)で遊べる箱庭リバーシを作ってみました。

対NPC戦・対人戦、どちらもできます。

もともとリアルタイムDBを使った対人戦ゲームの勉強がてら作っていたのですが、ついでにオセロAIとかも少し調べて実装してみました。
自分がオセロ素人なのでアレですが、NPCの中でも箱庭娘は地味に強くなった気がしますので、遊んでみてください。

以下、技術談義。

もうずっとアプリばかり作っていて、Web技術が完全におろそか&時代遅れな感じになっていたので、少しでも取り戻そうと勉強。
SPAとかPWAとか、そんな感じです。
(service workerは調整してもキャッシュがきつくて、思うように更新できず、いったん外してあるので、正確にはPWAにはなっていないのですが・・)

フロンドエンドはVue.js。laravelいじってた時の名残で、laravel-mixかませつつ、webpack使ってる感じです。

バックエンドはFirebase。基本無料なのと、リアルタイムDBに惹かれて使ってみました。
実験的なサービスのためにいちいち実費でサーバー(VM)借りて、環境設定してソフト入れてSSLも・・とかやらずに済むのでとても楽。
ホスティングのdeployやロールバックもとても簡単。

Firestoreも取り扱いがめっちゃ楽で、1時間経たずにリアルタイムな動きができてテンション上がったんですけど、だんだんとセキュリティ的に面倒なことに気付いてテンション下がり気味に・・

なんかこう、サーバー使ってる時のクセで、うちのドメインから以外はAPI接続禁止すればOKだよね、みたいのイメージしてたんですけど、いやいやこれJavaScriptでクライアントがダイレクトにつないでるやんけ・・どうするの・・的な。

で、これについてはFirestore側でJavaScript風コードでセキュリティルール策定するんですけど、微妙に手間がかかるのがネック。
NoSQLとかドキュメントベースのDBに慣れてないせいもあるのかもですが・・

結局コレクションごとのスキーマ的なものを書き、
createやupdateのパターンごとにバリデータ的なものを書き・・
ってこれなら、フィールドと型をあらかじめ設定できるほうが楽なんじゃ、と思いつつ。
テストもしづらいし。

セキュリティルールはとりあえず、

allow write: if request.auth.uid != null

とか、一応

allow write:
    if request.auth.uid != null
    && request.resource.data.title is string
    && request.resource.data.title.size() <= 100

みたいのでいいかなー、とか意外と軽く考えるかもですが、例えばこのルールだと確かにtitleは100文字以下の文字列に絞れるんですけど、逆にtitleが100文字以内であれば、fooとかいうフィールドに1万文字入れたリクエストなんかも通っちゃうんですよね。
なので

allow write:
    if request.auth.uid != null
    && request.resource.data.keys().hasOnly(['title'])
    && request.resource.data.title is string
    && request.resource.data.title.size() <= 100

みたいにしてゴリゴリ限定していく方向で・・。
これを全コレクション全フィールドでやるんだよ、おらぁ。

ちなみにrequest.resource.dataってのは、やってきたデータだけじゃなくて、更新後のresource.dataのイメージなので、更新するドキュメントにtitle以外のフィールドがあったりすると、hasOnlyにならなくて弾かれるぞ。ハマりポイント。

だからね、最初にね、全フィールド計画的にしようね。

サービスイン後にフィールドいじりたくなったら、メンテかけるか、止めたくなければ、バージョンフィールド作って、その値を元にバージョン別のセキュリティルール適用すればいいんじゃないかと思います。

あと他にも、Authenticationとか、許可済みコールバックにlocalhostが入ってたりするの、リリース時に消しておこうねっていう。

なんというか、今までと勝手が違う環境で、罠が多い・・

Firebase自体はまだベータな雰囲気がいろいろあるので、これからに期待したいです。

さくらVPSを借りてやることメモ 2018

主に自分用メモ。

■とりあえずアプデ

yum update

■作業用ユーザー追加/パスワード設定

useradd ユーザー名
passwd ユーザー名 ※pass設定しないとロックされたままでsshのpemログインできない

nginxの公開ディレクトリ置く場合
chmod 705 /home/ユーザー名

■SSH設定
まず自分のマシン(mac)でキーペア作る

ssh-keygen -t rsa
ssh-add id_rsa
scp id_rsa.pub サーバー:/home/ユーザー名/.ssh/authorized_keys

サーバー側

chmod 700 ./ssh
chmod 600 ./ssh/authorized_keys

これで自分のマシンから

ssh ユーザー@サーバー -i id_rsa

でログイン可能になる

セキュリティ向上のため、サーバー側でポート変更と、公開鍵のみ受け付けるようにする

vi /etc/ssh/sshd_config
※同じ場所にある ssh_config ではないので注意

Port 10022
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
RhostsRSAAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
AllowUsers sshを許可するユーザー名
SyslogFacility AUTHPRIV

■ポートの設定

現在の設定確認
firewall-cmd --list-service --zone=public

sshのポートを10022に変更する
vi /usr/lib/firewalld/services/ssh.xml

dhcpv6-clientを削除
firewall-cmd --remove-service=dhcpv6-client --zone=public --permanent

httpdなどを追加
firewall-cmd --add-service=http --zone=public --permanent

反映
firewall-cmd --reload

■ホスト名を変更

hostnamectl set-hostname ホスト名

■必要なソフトウェアの追加

LANG=C yum groups list
yum groups install "Compatibility Libraries"
yum groups install "Development Tools"

■自動起動設定

一覧
systemctl list-unit-files -t service

自動起動on
systemctl enable ***.service

自動起動off
systemctl disable ***.service

起動や停止、再起動など
systemctl restart ***.service

■nginx

vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
yum install nginx
vi /etc/nginx/nginx.conf
vi /etc/nginx/conf.d/default.conf

configtest的な
nginx -t -c /etc/nginx/nginx.conf

起動
systemctl start nginx.service
systemctl enable nginx.service

■ssl化
Let’s Encrtptを利用

cd /usr/local/
git clone https://github.com/certbot/certbot

cd certbot/
./certbot-auto

更新テスト

/usr/local/certbot/certbot-auto renew --force-renew --dry-run

cronで定期的に更新

crontab -e

00 05 01 * * /usr/local/certbot/certbot-auto renew --force-renew && /sbin/service nginx restart

ssl_dhparamのためのpem生成

openssl dhparam 2048 -out dhparam.pem

■PHP

yum install epel-release
yum localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install --enablerepo=remi,remi-php70 \
php \
php-devel \
php-mysqli \
php-pdo \
php-openssl \
php-mbstring \
php-opcache \
php-fpm \
php-intl

AWSのSDKなどで必要
php-xml

Laravelとか入れるなら下記も
php-pecl-zip

pear(pecl)

yum install libxslt
yum install --enablerepo=remi,remi-php70 php-pear

php-fpm

vi /etc/php-fpm.d/www.conf

user = nginx
group = nginx

;listen = 127.0.0.1:9000
listen = /run/php-fpm/php7.sock
listen.owner = nginx
listen.group = nginx
systemctl start php-fpm.service
systemctl enable php-fpm.service

■MySQL
yumのrepoをDL・localinstall

yum remove mariadb-libs
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum localinstall mysql57-community-release-el7-11.noarch.rpm 
yum install mysql-community-server

起動
systemctl start mysqld.service

初期パスワード表示
grep 'temporary password' /var/log/mysqld.log

初期パスワードでログイン後、パス変更
(デフォルトでは大文字、小文字、数字、記号が1つ以上、かつ8文字以上の必要がある)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password'; 

CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'password'; 
GRANT ALL ON *.* TO 'root'@'127.0.0.1';

民主主義

民主主義というのは選挙の結果と議会を尊重することで、一部のマスコミやでデモの声を聞くことじゃない、みたいな発言を見かけて。

正論ちっくに民主主義を骨抜きにするような考えで厄介だなぁと。
そしてこれが一般市民の口から出てくるのがなんとも。

なんとなくこれに同意すると、全体主義とか、扇動者の罠から逃れられないんですよね。
そもそも有権者が常に合理的で正しい判断をしてるとは限らない。

世論調査を見ても、ほかの内閣より良さそうとか、人柄が信用できないとか、その日によって意見が変わったり、そういう不安定な感情がの大勢を占めるこの世の中、どちらかと言うと、私たちはむしろ誤った選択をする可能性が高いと思うくらいがいいんじゃないか。

定義というより概念・理念の話で、これもいろんな意見があるとは思いますが、
民主主義の基本は、違う意見を持つ者同士がどう折り合いをつけて行くかってことだと思うのです。
なので、理想は常に満場一致。全員がとことん議論を尽くして万人が納得する落とし所を見つける。

もちろんこれは人数や時間的な面で現実的ではないので、一定の区切りを設けて、選挙や投票で決着を付けることにしてる。
そういう意味で、選挙の結果やその延長上にある議会というのは尊重しないといけない。これはその遠り。

しかし、そもそもの基本をすっ飛ばして、民主主義とは選挙であり多数決なのである、などと言うと途端に危うくなる。
みんなが賛成しているなら仕方がない、そんな思考停止にも陥りやすい。

まして、多数決が全てで、その他一部の声などいらないとというのは本末転倒も甚だしいんじゃなかろうか。

基本は意見をぶつけ合って、落とし所を探ることだ。
おかしいと思うなら声を上げるべきだし、上げて良いのだ。

選挙こそが全てで、デモや抗議は邪魔だし無駄という考えは、政治家はもちろん、全ての人が捨てないといけない。

(むろんレイシストやら感情論だけのトンチンカンなマスコミやデモもありますけどね。そこは十把一絡げにすべきではないところ)

そして声が上がったなら、聞くべきだと思います。
できるだけ折り合いを付ける努力をする、議論をする。

ただ、そのためには双方が真摯に、本気で落とし所を探ろう、という意思が無いといけない。

非常に重要なことのはずだけれども、ありえないほどにそういうのが欠けていると思うことがあるんですよ。

« Older posts

© 2018 しろログ

Theme by Anders NorenUp ↑