ssh2(php)を使った自動実行スクリプトを開発

◎構想                                                                    
・phpのssh2を使ってリモートのサーバを自動的に操作することによりサーバー管理の自動化を図る                           
・バックアップの自動化への使用に向けて実践的に必要な機能を実装していく                                    

◎課題                                                                    
・非同期処理を効率よく記述できるスクリプト言語が必要になる                                          
・パスワードやキーの管理について十分に検討する必要がある                                           

◎当面の目標                                                                 
・スクリプト化する前に簡単なコマンドを実行できるものを作ってみて、問題点などを洗い出す                            

◎スクリプト開発について                                                           
・以前サーバー管理の自動化を進めていたとき、Webソケットやssh2を使える非同期スクリプトの必要性を感じ、一旦作業を中断していた。         
  ・ブラウザを使ってサーバを管理する場合、ブラウザから中継象サーバーにWebソケットで接続し、そこからsshで、管理対象サーバーに接続する    
  ・ブラウザで対象サーバで行う処理を記述して実行し、状況に応じて待ったり、分岐したり、繰り返したりする必要が出てくる            
  ・そういうことを記述できるスクリプト言語が欲しい                                             
  ・使用例)                                                                
    ・管理しているサーバの一覧の稼働状況がリスト表示されている                                      
    ・一つのサーバを選択して、再インストールをクリックする                                        
    ・再インストールの意思を確認したあと、設定内容やコンテンツを保存したサーバからそれを取り出し、サーバを再構築する           
      ※このような例を増やし、それぞれに対応できる仕組みを作る時、専用のスクリプトがあると開発、運用の効率が上がりそうなら開発する   
      ※なくても実現できるならば開発はしなくてもよい                                          
・改めて再開するに当たってそれが必要になる状況と必要な機能、実装方法を明確にする。                              
・その後、個別の技術な実験を行いながら、他の用途のスクリプト言語との棲み分けを意識しながら開発していく。                   
◎作業記録                                                                  
・関連の実験用フォルダを実習専用フォルダに作成。                                               
・同フォルダにこれまでのssh2関連の実験の情報を収集するファイルを作成。                                    
・接続してlsの結果を表示するだけのプログラムが動いた。パスワードはソース埋め込み(削除済) 01                        
・ID、パスワードを入力する様に変更 02。はじめ動作せず焦ったが、タグにidだけ付け、nameを付けてないことが原因だった。            
・ajaxでの実行に変更。03                                                           
  ・ajax.jsを使用。                                                             
  ・htmlとphpにファイルを分離                                                        
・バックアップに使うことを前提に画面を変更し機能を追加していく。04                                      
  ・検討事項                                                                
    ・「バックアップ&リストアツールの開発と実践」の進捗を確認し合流を検討する                              
  ・方針                                                                  
    ・まず対象のサーバでバックアップが必要な項目の1つをブラウザからの操作でバックアップできるようにする                 
    ・徐々に対象を広げていく                                                       
    ・対象を分類しながら、必要な定義をすればバックアップできるようにする                                 
    ・ブラウザからのAPI呼び出しと同じことをするバッチで動かせるプログラムを作成する                          
    ・ブラウザでは設定と手動実行をできるようにし、自動実行のコントロールもできるようにする                        
  ・要件                                                                  
    ・対象サーバ(VPS)のnamedに関する設定ファイルをローカルのサーバの外付けドライブにバックアップする                 
  ・実現方法                                                                
    ・前提 ローカルのKVMゲストのうち外部公開されていないゲストがありマルウェアが入りこまないように管理されている。それを司令塔とする。
    ・司令塔はsshで自分にログインし、その中でscpを使って対象サーバから所定のファイルを取って来る                     
    ・司令塔はローカルのKVMホストに接続された専用のUSBドライブをマウントしてファイルを書き込む。当面はUSBメモリとする      
  ・作業                                                                  
    ・ゲストOSにホストOSに接続されたUSBメモリを接続                                        
  ・方針変更                                                                
    ・司令塔はhttpdを起動しないのでブラウザからの操作に対応する部分は実装せず、バッチ処理を前提とする                   
  ・準備(司令塔にて)                                                           
    ・司令塔でssh2を使えるようにする                                                   
      dnf update                                                            
      dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm                        
      dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm                                
      dnf module enable php:remi-7.4                                                  
      dnf install php php-cli php-common                                                
      dnf install php74-php-pear                                                    
      dnf install php74-php-pecl-ssh2                                                  
      echo "/opt/remi/php74/root/usr/lib64/php/modules/ssh2.so" > /etc/php.d/ssh2.ini                          
      ※履歴からの抜粋なので漏れや余分なものがあるかもしれないので注意が必要                              
    ・テストプログラムでssh2が使えることを確認する                                            
      vi ssh2.php   ここで以前他のところで使ったプログラムを移植。自分にログインして、対象サーバにログインしてlsを実行し結果を取得。 
      php ssh2.php  正常に動作した                                                  
    ・rsyncでコピーできることを確認する                                                  
      rsync -e ssh -avc --exclude=lib xxx.xxx.jp:/var/www/htmls /home/xxx/htmls                             
  ・方針                                                                  
    ・テストプログラムを変更してrsyncを実行するように変更                                         
  ・検討                                                                  
    ・とりあえず、相手サーバと取得ディレクトリはソースに直書き                                      
    ・必要なパスワードは暗号化してファイルで所定の場所に置く。                                      
      ・目的はファイルだけ見られてもパスワードが見えないこと。プログラムとセットで見つかり解析されることは想定しない          
  ・実験                                                                  
    ・phpで使える可逆暗号化を調べ実験する  openssl_encrypt openssl_decrypt が使えた                          
  ・方針                                                                  
    ・キーはプログラムの最初のところで定義                                                
    ・暗号化したデータの置き場所もプログラムの最初のところで定義                                     
  ・仕様                                                                  
    ・キー=「キーは十分長くしておいた方が安全と言われています。」 ※opensslの関数には当てはまらない                   
    ・暗号化するもの=自分のへのログインパスワード、対象サーバへのログインパスワード                           
    ・暗号データの置き場所=/etc/autobackup.conf                                             
    ・バックアップデータの置き場所=USBメモリ/autobackup/ホスト名/パス                                 
    ・処理概要                                                              
      ・自分にログイン                                                         
      ・USBメモリをマウント                                                     
      ・対象サーバの対象ディレクトリをrsyncでコピー                                           
      ・USBメモリをアンマウント                                                   
  ・実装手順                                                                
    ・定義を記述                                                             
    ・暗号化したファイルを作成                                                      
    ・複合確認                                                              
    ・コピー先を内部ディレクトリとしてrsyncを手で実行し応答文字列を収集                                  
    ・コピー先を内部ディレクトリとしてrsyncをスクリプトで実行                                       
    ・USBメモリのマウント、アンマウントを追加し、コピー先をUSBメモリに変更                             
  ・実装手順                                                                
    ・暗号化したデータの置き場所もプログラムの最初のところで定義                                     
  ・仕様変更                                                                
    ・キーの適切な長さは決まっており、ランダム値を使った方がいいことが分かったので、opensslの関数を利用して生成することにした       
    ・生成するモードとそれを使うモードを用意し、前者で所定の場所にファイルとして保存することにした                    
  ・状況(司令塔にて)                                                           
    ・暗号化したパスワードを使って、対象のサーバにログインしてlsを実行するところまで出来た。                       
    ・rsyncを実行したときのレスポンスを調べた結果、password:が来るのを待ってパスワードを送り、                      
     コマンドプロンプトが来るまで待てばいいことが分かった                                        
     それを実装してrsyncが出来るようになった                                               
  ・次回以降                                                                
    ・USBメモリのマウント、アンマウントを行って、USBメモリに保存するところから                           
    ・また、複数の領域をrsyncしたり、その前に処理をしたりすることを設定だけ書けばできるようにする                     
  ・作業再開                                                                
    ・USBメモリのマウント、アンマウントを行って、USBメモリに保存するところから 05                         
    ・司令塔でcrontabを設定、毎日バックアップを実施                                            
  ・考察                                                                  
    ・特定のディレクトリのバックアップ用途ならばスクリプト化の必要はなくファイルから設定を取り出し実施する仕組みがあればよい       
    ・バックアップについては一旦、設定ファイルの方向で『バックアップ&リストアツールの開発と実践』で引き続き改善を続け、         
     スクリプト化の必要があればここで検討                                                

<TODOと状況>