しろログ

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

カテゴリー: IT・コンピューター (page 1 of 15)

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

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

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';

CentOS 7 nginx PHP7 MySQLなどメモ

毎度の個人的なメモ

■基本設定
SELINUX無効化

setenforce 0

vi /etc/selinux/config

SELINUX=disabled

ホスト名

vi /etc/hostname

ifconfigはなくなった

nicの確認など
ip a

■初回のyum関連
minimalでインストールした場合

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

■ネットワーク周り

nmcli device
nmcli device show eno1
nmcli con up eno1
nmcli con down eno1
IPアドレスを192.168.1.10、GWを192.168.1.1に変更
nmcli con mod eno1 ipv4.addresses "192.168.1.10/24 192.168.1.1"

DNSサーバを192.168.1.11、192.168.1.12に変更
nmcli con mod eno1 ipv4.dns "192.168.1.11 192.168.1.12"

自動起動
nmcli con mod eno1 connection.autoconnect "yes"

systemctl restart NetworkManager

■iptablesはfirewallになった

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

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

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

反映
firewall-cmd --reload

メジャーなものはここにある。無ければ追加
ls /usr/lib/firewalld/services/

■chkconfigはsystemctlになった

一覧
systemctl list-unit-files -t service

自動起動on
systemctl enable sshd.service

自動起動off
systemctl disable sshd.service

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

■nginxとか
yumで済ませる

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

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

PHP
yumで済ませる

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

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

systemctl start php-fpm.service
systemctl enable php-fpm.service

MySQL
yumのrepoをDLしてyumで済ませる

yum remove mariadb-libs
yum localinstall mysql57-community-release-el7-8.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';

■Node.js

$ curl -sL https://rpm.nodesource.com/setup_8.x | bash -
$ yum install nodejs

■覚書
apache2.4系をsystemctlで使うには、mod_systemdをロードする必要があるらしい。

開発用サーバーの証明書

いわゆるオレオレ証明書の作り方メモ

openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

apacheの場合、作成したserver.crtと、server.keyをこんな感じで設定。

SSLCertificateFile /etc/cert/server.crt
SSLCertificateKeyFile /etc/cert/server.key

参考
Nginxにオレオレ証明書を設定する

余談
こんな感じで、割と簡単なんですけど、iOSアプリのATS対応のためにはオレオレだと結局引っかかってしまうので、debugビルドの時はATSを無効にするような切り分けとかしたほうが楽っていう・・

Plistを操作するPlistBuddyでiOS9のApp Transport Securityの煩わしさから開放される

« Older posts

© 2019 しろログ

Theme by Anders NorenUp ↑