🐪

Apache CamelのSCPコンポーネントを試す

2020/11/05に公開約2,600字

手順

  1. SSHログイン用のサーバーを立てる(Docker)
  2. CamelのSCPコンポーネントを使ってSCPする

1. SSHログイン用のサーバーを立てる(Docker)

前提条件:Dockerがインストールされている

a. 必要なファイルを用意する

$ mkdir eg_server && cd eg_server
$ mkdir config_files && cd config_files
$ ssh-keygen -t rsa -m PEM
Enter file in which to save the key (/Users/<username>/.ssh/id_rsa): ./id_rsa_pem
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
$ cd ..
$ vi Dockerfile

以下のDockerfileを作成

Dockerfile
FROM ubuntu:18.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:rootpasswd' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
RUN sed -i 's/#Port 22/Port 20022/' /etc/ssh/sshd_config
COPY ./config_files/id_rsa_pem.pub /root/.ssh/authorized_keys

EXPOSE 20022
CMD ["/usr/sbin/sshd", "-D"]

この時点でファイル構成は以下になる
この時点でのファイル構成

b. サーバー用のコンテナを走らせる

$ docker build -t eg_server .
$ docker run -itd -p 20019:20022 --name test_server eg_server

これで、ポート20019番を使ってサーバーにログインできるようになる

$ ssh root@127.0.0.1 -p 20019 -i ./config_files/id_rsa_pem

2. CamelのSCPコンポーネントを使ってSCPする

前提:Javaの実行環境がある

GitHubからサンプルコードをダウンロード

https://github.com/shti-f/camel-test

1で作成したid_rsa_pemsrc/main/resources/にコピーし、MainScpを実行
1で動かしたサーバー上にファイルがコピーされている

3. (試した後)クリーンアップ

$ docker container stop test_server
$ docker container rm test_server
$ docker image rm eg_server

簡単な解説

Camel-SCPはJSchというSFTPのライブラリで実装されています。
そのせいか否か、いくつか詰まるポイントがあります。

CamelのSCPはProducerのみ

CamelのSCPコンポーネントはProducerとしてしか使えません。
つまり、Camelを実行している場所から他の場所にコピーすることはできますが、他の場所からファイルをコピーすることはできません。
今回の例では、自分のマシン上のファイルをDockerでたてたサーバーにコピーしています。

Public/Private Keyを生成する際、PEM形式を指定する必要あり

2020年11月の現在、JSchではOpenSSHの鍵形式をサポートしていません。
PEM形式を指定しない場合、以下のようにprivate keyの読み込みでエラーが起きます。

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot load private keyfile: src/data/id_rsa

2018年8月にOpenSSH 7.8がリリースされました。
このバージョンアップでssh-keygen で作成される鍵のデフォルトがOpenSSLのPEM形式からOpenSSHの形式に変更されたようです。
そのため、ssh-keygenの際に-m PEMのオプションをつける必要があります。

strictHostKeyChecking=noに設定する

CamelのSCPコンポーネントのドキュメントをみると、strictHostKeyCheckingはデフォルトでnoに設定されているように思えますが、明示的に設定する必要があります。

参考

Dockerize an SSH service
SCP (Apache Camel公式)
【OpenSSH 7.8】秘密鍵を生成する形式が変更になった件について

Discussion

ログインするとコメントできます