やっつけ不定記

好きなときに好きなことをちゃっちゃと書いてます

SonarQubeでスキャンしてみた

少し前に書いたSonarQube
https://chocopurin.hatenablog.com/entry/2020/06/14/223427
の続きです。だいぶ間が空きましたが、実際にスキャンをしてみます。

JavaのプロジェクトをスキャンするときはMavenやGradleとの連携が必要ですが、
自分がやりたいのは、既存のPHPPythonコードのスキャン。
スキャナツールを導入して、それを単品実行する形になります。

(1)サーバとスキャンの関係
概ね下記になります。ここでは1台のPCとVM上ですが、
実運用の際はサーバとスキャナを物理的に分ける方がいいんでしょうね。

・サーバ(先の記事で構築済み)
プロジェクト作成、スキャン結果格納、結果閲覧用のWebインタフェース。

・スキャナ
スキャン対象のソースコード格納、スキャン実行、結果のサーバへの送付

(2)事前作業
サーバコンテナが使っているネットワーク名とIPアドレスをメモしておく。

・参考
http://docs.docker.jp/engine/userguide/networking/dockernetworks.html

$ sudo docker network ls
$ ifconfig
$ sudo docker exec -it ec2-user_sonarqube_1 /bin/bash
bash-5.0# ifconfig

(3)スキャナ構築
Amazon Linuxのイメージからコンテナを作成する。
Dockerコンテナ版もあるようですが、スキャナについてはあえて一から作っています。

$ sudo docker pull amazonlinux
$ sudo docker run --net [ネットワーク名] -it --name [コンテナ名] -p 3022:3022 amazonlinux:latest /bin/bash
  →ポートフォワーディングはSSHすることがありそうなとき対策なので、たぶんなくてもよい
bash-4.2# echo "xxx.xxx.xxx.xxx [任意の名前]" >> /etc/hosts
  →スキャナからサーバへの名前解決。IPアドレス直アクセスで行う場合は不要。
   ここではsonarserverという名前をつけている。

前提ミドルウェアを導入する。解析中にNode.jsが使われているので、
それに必要なものも合わせて入れている。

[OSバンドル]
$ sudo docker exec -it [コンテナ名] /bin/bash
bash-4.2# yum -y install zip unzip wget gcc-c++ findutils tar net-tools telnet
  →net-toolsとtelnetは、作業中にifconfigコマンドとtelnetコマンドを実行するために入れたので、
   実際にはあってもなくてもよい。ソースコードの取得方法次第ではgitもインストールする必要がある。


[Node.js]
・参考
https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html
https://stackoverflow.com/questions/51204115/unable-to-install-nvm-using-docker

bash-4.2# touch ~/.bashrc && chmod +x ~/.bashrc
bash-4.2# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
bash-4.2# chmod +x ~/.nvm/nvm.sh
bash-4.2# ~/.nvm/nvm.sh
bash-4.2# source ~/.bashrc
bash-4.2# nvm install node
bash-4.2# node -e "console.log('Running Node.js ' + process.version)"

https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
から「Linux 64-bit」のスキャナを取得、導入する。

bash-4.2# cd /opt
bash-4.2# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.3.0.2102-linux.zip
bash-4.2# unzip sonar-scanner-cli-4.3.0.2102-linux.zip

(5)プロジェクト作成
ブラウザからサーバにログインして、右上の「Create new project」をクリックする。
f:id:chocopurin:20200705212055j:plain

Project keyを入力して「Set Up」をクリックする。
ここではProject keyとして「zen-cart」を登録する。
f:id:chocopurin:20200705212102j:plain

「Generate」を押す。トークンのベース文字列を変更したい場合は任意の文字列を入力する。
f:id:chocopurin:20200705212309j:plain

トークンを確認して「Continue」をクリックする。
f:id:chocopurin:20200705212206j:plain

スキャン対象の言語を選択する。ここでは「Other(JS,・・・)」をクリックする。
f:id:chocopurin:20200705212212j:plain

スキャナのOSを選択すると、スキャンコマンドのサンプルが表示される。
Amazon Linux 2を使っているので、ここでは「Linux」をクリックする。
なお、「Download」を押下すると、スキャナのダウンロードページに飛ぶことができる。
f:id:chocopurin:20200705212750j:plain

(6)スキャン対象の取得
スキャン対象はMS Application Inspectorのとき
https://chocopurin.hatenablog.com/entry/2020/06/01/223512
と同じ古いZen-Cartを使います。
スキャナ側にソースコード用のディレクトリを作成して、そこにソースコードをダウンロードする。
Dockerでやっている場合は(3)のスキャナ構築時点でマウント設定入れておくのもあり。

bash-4.2# mkdir /tmp/target
bash-4.2# cd /tmp/target
bash-4.2# wget https://ja.osdn.net/dl/zencart-jp/zen-cart-v1.2.0-l10n-jp-6.zip
bash-4.2# unzip zen-cart-v1.2.0-l10n-jp-6.zip

(7)スキャン実行
ソースコードディレクトリに移動してスキャンを実行する。(5)で表示された
スキャンコマンドはあくまでもサンプルであるため、自分が使いたい形に作り変える。
ここでは、SCM連携をしないようオプションを追加している。
本件の手順でスキャン実行すると、スキャンコマンドを実行したディレクト
(ここではソースコードのトップディレクトリ)に.scannerworkという
ワークディレクトリができる。

bash-4.2# cd /tmp/target/zen-cart-v1.2.0-l10n-jp-6
bash-4.2# /opt/sonar-scanner-4.3.0.2102-linux/bin/sonar-scanner \
            -Dsonar.projectKey=zen-cart \
            -Dsonar.sources=. \
            -Dsonar.host.url=http://sonarserver:9000 \
            -Dsonar.login=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
            -Dsonar.scm.disabled=true

[コマンド構文]
(スキャナのインストール先)/bin/sonar-scanner \
   -Dsonar.projectKey=(Project key) \
   -Dsonar.sources=. \
   -Dsonar.host.url=http://(サーバ名もしくはサーバのIPアドレス):9000 \
   -Dsonar.login=(生成されたトークン) \
   -Dsonar.scm.disabled=true


[スキャン成功時のログ]
・・・
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
・・・

(8)結果確認
スキャンが完了すると、サーバ側で結果の集計が行われる。
ブラウザでサーバ側のプロジェクトにアクセスすると、集計の様子がわかる。
f:id:chocopurin:20200705212225j:plain

f:id:chocopurin:20200705212230j:plain

f:id:chocopurin:20200705212239j:plain

サーバ側の集計が完了すると、各種指標を閲覧できる。
f:id:chocopurin:20200705212244j:plain

f:id:chocopurin:20200705212250j:plain

指摘ポイントをクリックすると、レビュー画面に進んで結果の精査を行える。
f:id:chocopurin:20200705212256j:plain

f:id:chocopurin:20200705212304j:plain

(9)その他:request entity too large
スキャン自体は成功していることになっているが、ログを見てみると、

ClientError [PayloadTooLargeError]: request entity too large

でERRORになっている部分がある。
スキャナが内包しているNPMパッケージ:body-parseの100KB制限
https://github.com/expressjs/body-parser#limit
に起因しているようで、GitHubにIssueが出ている。
https://github.com/SonarSource/sonar-css/issues/251
手動で変更できないか方法を探ってみたがわからず。
待つしかないのかな・・・!?。

(10)その他:SonarQube8.4リリース
本エントリーを試しているときのバージョンは8.3だったのですが、
文章にまとめているまさにそのときに8.4公開のアナウンス。
https://twitter.com/cluclu_land/status/1279420440121753600
どこかでバージョンアップしないと・・・。

<戦利品>
昭和オトメ御伽話(5)
約束のネバーランド(19)