• ベストアンサー

CGIからSSHを使いたい

こんにちは。 CGIから他のマシン上にシンボリックリンクを作る方法で困っています。 現在開発中のシステムは、フロントエンド用のマシンが複数(2台)あり、ロードバランサーにより、接続が切り替えられるようになっています。 つまり、同じURLアドレスにアクセスしても、どのマシンにつながるかはそのとき次第です。 このシステム上で、管理者メニューとして、Web上の項目を増やしたり減らしたりしたいのですが、その際に単なるファイルコピーやディレクトリの作成だけではなく、シンボリックリンクを作成したいのです。 同じマシン上であれば、パーミッションをそれなりに設定することで、CGIからでも、上記の操作が可能ですが、他のマシン(この場合、現在つながっていのいほうのもう1台のマシン)に対してはどのようにすればよいのでしょうか? 使えるプロトコルはsshとftpがあります。rcpやrloginは使えません。 sshを使えは、リモートマシンにシンボリックリンクを作成できるのですが、CGIから使用する方法がわかりません。シェルからであれば、暗号鍵を作ることにより、パスワードなしでのログインにも成功したのですが、CGIからだとユーザーが特殊なためにうまくいきません。 いっそ、CGIのLocationヘッダで飛ばすことも考えましたが、Basic認証を使っているために、パスワードを聞かれてしまい、その際にエスケープしてしまうと、処理が不完全になってしまいます。 なんとかsshでできないものかと調べてはいるのですが、いい情報がみつかりません。どなたか方法をご存知ないでしょうか。よろしくお願いします。

  • CGI
  • 回答数5
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

ローカルで実行してみましたが、ホームディレクトリを555にした状態でも ログインを確認できましたよ? ログイン先への鍵登録(authorized_keys)もしてありますよね? 1点嘘ついたかもしれません、鍵はwww-dataで作成してください。 よく考えたら、鍵の作成は本人でないとだめな気がしました^^;; のこるは、ホストベース認証(.shosts)くらいしか思い浮かばないです。 # サーバ同士の接続ならホストベースもありかなと。。。 参考までに僕が実験したときの情報です。 $ pwd /tmp/webuser1_ssh $ ls -la total 12 drwxr-xr-x 2 webuser1 wheel 512 Apr 14 22:33 . drwxrwxrwt 8 root wheel 512 Apr 14 21:51 .. -rw------- 1 webuser1 wheel 219 Apr 14 22:33 config -r-------- 1 webuser1 wheel 1675 Apr 14 21:53 webuser1_rsa -r--r--r-- 1 webuser1 wheel 409 Apr 14 21:53 webuser1_rsa.pub -r--r--r-- 1 webuser1 webuser1 599 Apr 14 22:21 known_hosts.global $ cat config Host TEST Hostname localhost User sshuser1 IdentityFile /tmp/webuser1_ssh/webuser1_rsa UserKnownHostsFile /tmp/webuser1_ssh/known_hosts.global # GlobalKnownHostsFile /tmp/webuser1_ssh/known_hosts.global BatchMode yes $ ssh -F /tmp/webuser1_ssh/config TEST ---- $ ls -la ~ total 22 dr-xr-xr-x 2 webuser1 webuser1 512 Apr 14 22:23 . ← 555 drwxr-xr-x 4 root wheel 512 Mar 30 20:59 .. -rw------- 1 webuser1 webuser1 2017 Apr 14 22:23 .bash_history -rw-r--r-- 1 webuser1 webuser1 751 Mar 30 00:22 .cshrc -rw-r--r-- 1 webuser1 webuser1 248 Mar 30 00:22 .login -rw-r--r-- 1 webuser1 webuser1 158 Mar 30 00:22 .login_conf -rw------- 1 webuser1 webuser1 373 Mar 30 00:22 .mail_aliases -rw-r--r-- 1 webuser1 webuser1 331 Mar 30 00:22 .mailrc -rw-r--r-- 1 webuser1 webuser1 766 Mar 30 00:22 .profile -rw------- 1 webuser1 webuser1 276 Mar 30 00:22 .rhosts -rw-r--r-- 1 webuser1 webuser1 975 Mar 30 00:22 .shrc

titokani
質問者

お礼

検証ありがとうございます。 相変わらず、 Could not create directory '/var/www/.ssh'. とは出るものの、接続に成功しました。 以下、手順です。 スーパーユーザーで作業します。 # mkdir .ssh # chown www-data:www-data .ssh # chmod 700 .ssh # sudo -u www-data ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/var/www/.ssh/id_rsa):/XXX/XXX..XXX/.ssh/id_rsa <-作ったディレクトリを指定 Enter passphrase (empty for no passphrase): <-パスフレーズは入力しない Enter same passphrase again: <-同じく入力しない The key fingerprint is: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX www-data@xxxxxx #vi .ssh/ssh_config #cat .ssh/ssh_config IdentityFile /XXX/XXX..XXX/.ssh/id_rsa UserKnownHostsFile /XXX/XXX..XXX/.ssh/known_hosts # id_rsa.pubをリモートマシンの~/.ssh/authorized_keysに追加 # sudo -u www-data ssh -F .ssh/ssh_config xxx@xxxx ls <-lsは適当 Could not create directory '/var/www/.ssh'. The authenticity of host 'xxxx (xxx.xx.xx.xxx)' can't be established. RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'XXXXX,XXX.XX.XX.XXX' (RSA) to the list of known hosts. # sudo -u www-dataでキーを作成することと、一回だけsudo -u www-dataでリモートマシンにログインするというのがキモのようですね。 エラーログにゴミが残るのがイマイチですが、まあよしとしましょう。 #リダイレクトすれば消せるんでしょうけど、本当のエラーが見えなくなっても困りますしね。

その他の回答 (4)

回答No.4

ものすごく危険なことをしようとしている気がしないでもないですが 鍵を直接指定してみてはいかがですか? 詳しくは man sshで。 手順的にはこんな感じなるのではないだろうかと。。。 1. 接続用の鍵を作成する(ユーザは誰でもいい) 2. 同じく configファイルを作成する 3. 実行する ssh -F 作成したコンフィグファイル host 'コマンドライン' configファイル で IdentityFile を指定するのがポイントかと でも、やったことないので、本当にできるのかわかりません。 作成したファイルはwebから参照できないように注意してください。 もしかしたら、鍵の所有者はwww-dataにしてあげないとだめかもしれません。

titokani
質問者

補足

ありがとうございます。 試してみましたがだめでした。 IdentityFileを指定するほか、IdentitiesOnlyをyesにしたり、UserKnownHostsFileを指定してみたりもしたのですが、相変わらずerror_logには、 Could not create directory '/var/www/.ssh'. と出続け、意地でも/var/www/.sshを作ろうとするようです。

回答No.3

>www-dataは普通のユーザーではありませんので、ホームディレクトリがありません。パスワードもわかりません。 rootになれるならその辺いくらでも変更できると思うのですが? ということです。 '/var/www/.ssh'を作ろうとしているということは、www-dataのホームディレクトリが/var/www/だからでしょう。いざとなればrootで鍵セットを作ってそこに置いておけば他のユーザと同じくパスワードなしのログインが可能なはずです。またはwww-dataのホームディレクトリを変更してしまうことも可能なはず。 さらにどちらもできないということなら、SuExecで任意のユーザでhttpdを動かすとか。 そう言うことを自由にできるのがrootユーザなわけですから、最初の質問が出たわけです。

回答No.2

www-dataユーザがパスワードなしで相手マシンにログインできるようにすればいいのではないですか? それでもエラーか何かがでてできないということでしょうか? 「ユーザーが特殊なため」の特殊とはどういう意味でしょうか。

titokani
質問者

補足

今知っているやりかたですと、ユーザーの~/.ssh/を必要とするのです。 www-dataは普通のユーザーではありませんので、ホームディレクトリがありません。パスワードもわかりません。 このため設定できない状態です。 認証キーファイルだけなら、-iオプションで設定できるようなので、これを設定してみてはいるのですが、apacheのエラーログを見ると、 Could not create directory '/var/www/.ssh'. Host key verification failed. と出ています。 CGIの環境変数を確認してみましたが、/var/www/を示しているものはなく、なぜ/var/www/.sshを作ろうとするのか不明です。これを作らせないようにすることができれば、うまくいきそうに思うのですが。 sshのオプションか、ssh_configで既存のディレクトリを設定できないものかと、いろいろ試しているのですが、どうにも設定てきない状態です。 あるいは、もっと他の方法がありますでしょうか?

回答No.1

>CGIからだとユーザーが特殊なためにうまくいきません。 ということはroot権限でマシンを操作できないのでしょうか? 少なくともhttpdの権限になれるか、SuExecで自分の権限でhttpdが動いてくれるかでないとsshでの実現は難しいですが。 もしそうならサーバ管理者に相談するのが手っ取り早いです。

titokani
質問者

補足

>ということはroot権限でマシンを操作できないのでしょうか? ユーザーを確認すると、www-dataとなっています。 root権限は取得できますが、root権限があったとして、どのような設定を行えばよいのでしょうか?

関連するQ&A

  • パスワードなしで ssh のログインを行いたい

    http://www.okweb.ne.jp/kotaeru.php3?q=588282 の続きです いろいろ回答をいただいて問題点が少しはっきりしたので、質問の焦点を絞って再投稿します。 2台の Windows XP の PC に、Cygwinをいれ、OpenSSH サーバをたてています(サービスとして動かす)。  「パスワードなしで ssh のログインを行いたい」 のですが、うまくいきません。設定は、次のように行いました。 (1) クライアントPCで公開鍵をつくる   $ ssh-keygen -t rsa で(パスフレーズを空白にして)公開鍵を作成(identity.pub) (2) ホストPCに鍵をコピーして、   % cat identity.pub >> .ssh/authorized_keys のように、authorized_keys に鍵の内容を追加する。 Linux がホストの場合は、以上の手続きで「パスワードフリー」になったのですが、 Cygwin ではだめです。   $ssh -1 192.168.0.5 1   Permission denied.   $ ssh 192.168.0.5   Permission denied (publickey,keyboard-interactive). のようになって、失敗してしまいます。

  • iMac(OSX10.6.6)でのSSH接続の方法

    お世話になります。 先日までWin7のTeratermでSSH接続していたのですが、iMacにマシンが変わってからSSH接続の方法がわかりません。 現在ターミナルから.ssh内にWin7からもってきたpubkey.pub(鍵)を設定して接続をこころみていますが、なかなかつながりません。 エラーは、 Permission denied (publickey,gssapi-with-mic). になっています。 Win7ではTeratermのショートカット(エイリアス?)をつかって、 "C:¥Program Files (x86)¥teraterm¥ttermpro.exe" hostname:22 /ssh /1 /auth=publickey /keyfile=C:/pubkey.pub /user=hoge /passwd=hogehoge /KR=UTF8 /KT=UTF8 みたいな感じで接続していました。 ssh-keygenから鍵を作成してSSH側に設定するということが現在権限がなくてできないのですが、pubkeyのみでWin7からMacに移行できる方法があればおしえてください。 chmod 700 .ssh/ chmod 600 .ssh/pubkey.pub とパーミッションも大丈夫です。 現在Macターミナルから、 ssh -p 22 hoge@hostname -i ~/.ssh/pubkey.pub とやろうしています。 また、ちょっと理論的にはっきりとわかっているわけではないので、やや混乱しておりますが、クライアント(リモート側)がSSH接続に必要なものは(設定にもよりますが…)公開鍵だけでよいのでしょうか?以前のWin7では公開鍵とパスワードのみで接続していたと認識しています。 よろしくお願いします。

  • rcpについて

    みなさんにお尋ねしたいことがあります。 Linux(RedHat8.0)上でのrcpです。 現在マシンA→マシンBにrcpでディレクトリを転送したいのですが、 以下の事象で出来ない状態となってます。 [事象]以下の構成のディレクトリとコピーすると    親フォルダ(下記a)は作成されるが、サブフォルダ以下 (下記b、c)はpermission deniedではじかれてします。 [フォルダ構成]  a----b----実行fileが20コ | c----実行fileが20コ windowsみたいに親フォルダのパーミッションは継承されないのでしょうか? なおコピー先のアクセス権は777となっていて.rhostsにも記述済みで rloginは可能です。またコピー元のアクセス権の変更は不可です。 行ったことはumask=0設定やchmodのRオプションなどです。 もし解決方法をご存知の方がいらっしゃれば教えてください。

  • Net::SSH::Perlについて

    Net::SSH::Perlを使って、以下のようにリモートマシン上のコマンドを実行しています。 my $ssh = Net::SSH::Perl->new("host"); $ssh->login("user", "pass"); ($out, $err, $exit) = $ssh->cmd("command"); "command"に失敗した場合は、$errにエラー内容が格納されますが、hostやuser、passが間違っていた場合は、Permission deniedとなって、プログラムが終了してしまいます。 hostやuser、passの間違いで$ssh->cmdを失敗した場合にエラーを取得する方法があれば教えてください。

    • ベストアンサー
    • Perl
  • infoseekでのCGI掲載方法

    INFOSEEKにCGIをのせるにはまずcgi-binというフォルダを作成しなければいけませんよね? そのcgi-binのフォルダの中にcgiを入れる必要があるのはわかるのですが、そのcgi-binのフォルダの中にまたフォルダを作る必要はあるのでしょうか?作らなくても動きますか? また、cgiのファイルにリンクさせるにはファイルの参照はファイル名でいいのでしょうか?それともURLでリンクさせるのでしょうか? このページにアクセスできません。(403 Forbidden) と出てきて困っています。 パーミッションは設定してあり、indexはちゃんとあります。 どなたか教えてください。

  • AT-linkのcgiが動かない パーミッションが原因?

    現在AT-linkというサーバーで、ホームページを作成しています。 http://www.carlifeauto.co.jp/shop/index.htm HTMファイルは問題なく表示できるものの、 cgiファイルが動きません。 http://www.carlifeauto.co.jp/shop/shopprev.cgi パーミッションが問題かなとも思うのですが、 パーミッションの指定を変更してもうまく動作しませんでした。 「755」「704」「711」「644」などなど・・・ 原因等わかる方がいらっしゃいましたら教えてください。

  • SSHのパスワード無し認証(公開鍵暗号方式)

    過去ログに似た質問がいくつかあり、それらを参考にしましたが、何故か私の環境では上手く行かないので、何が原因なのか、どうすればよいのか、どなたか教えて頂けると嬉しく思います。 ■やりたいこと ・SSHでパスワード無しログイン ■環境条件 ・ローカルマシン(接続元)   VineLinux 3.1 ・ホストマシン(接続先)   VineLinux 3.1 ・両方のマシンに同じユーザ(hikaly)があり、ログインパスワードは同じものになっている。 ■手順 ローカルマシンにhikalyでログインし、 $ ssh-keygen -t rsa -N "" でパスフレーズ無しの鍵を作成する。 /home/hikaly/.ssh/id_rsa.pub というファイルを、ホストの /home/hikaly/.ssh/ にコピー。この際、WinSCP3を使って、ローカル→作業用Windowsマシン→ホスト とコピーを行いました。 ホストの /home/hikaly/.ssh/ には authorized_keys が存在しなかったので、コピーした rsa_id.pub を authorized_keys に改名。 ホスト側で root になって sshd_config を編集。 RSAAuthenticationを「yes」にして保存。sshdを再起動させました。 ■結果 これでローカル側からホスト側にパスワード無しで接続できるはずだと思いますが、 hikaly@hostmachine's password: とパスワードを尋ねられてしまいます。 いろいろとググッて調べてみたところ、「接続先(ホスト側)でssh-keygenしてできたrsa_id.pubを接続元(ローカル側)にコピーせよ。」と読める資料を見つけましたが、多くのものは「接続元でssh-keygenして接続先にコピーせよ。」と書かれています。ワケ分からなくなってきました。(;´ρ`) 私の質問もややこしくてワケ分からなくてすいません。

  • CGIに詳しい方居ませんか

    パスワード制限を設置しようと思いダウンロードしたのですが、CGIが絡んでいてリンク方法などがよく分りません 何方か詳しく教えて頂けませんか http://cgi-garage.parallel.jp/password.html 上記URLのパスワード制限3というものです。 解説に設置方法が記載されてますが、よく理解できず困っています それから補足質問をするかもしれませんが、宜しくお願いします。

  • SSHの設定

    こんばんは。 ServerA ClientB 上記2台のマシンにSSH通信を設定したいと思います。 両方ともOSはRedhat EnerPrise Linux4です。 ClientBの作業: # ssh-keygen -t rsa # scp ~/.ssh/id_rsa.pub root@ServerA ⇒公開鍵をServerAにコピー ServerAの作業: # cd .ssh # touch authorized_key # chmod 600 authorized_keys # cat ~/id_rsa.pub >> authorized_keys 上記はrootユーザですが、仮に「oracle」など別のOSユーザで通信を する場合、ClientBとServerAの両方にOSユーザとして、 「oracle」を作成しておく必要はあるのでしょうか?。 アドバイスお願いします。

  • パスワード入力なしでsshログイン

    パスワード入力なしでsshログインしたいけど上手く行きません。 CentOS7のPCが2台(CentOS7-C, CentOS7-S)あります。 CentOS7-CからCentOS7-Sにパスワード入力なしでsshログイン(鍵認証でログイン)したいと思い、下記のサイトを参考にしながら悪戦苦闘しています。 パスワード入力なしでsshログイン(鍵認証でログイン) https://setting-tool.net/ssh-key-authorize <手順> クライアント側  ssh-keygen -t rsa でキー生成 サーバー側  クライアントで生成したキーを保存 <コマンド> ■前提 クライアント側 CentOS7-C 172.16.0.201 サーバー側 CentOS7-S 172.16.0.202 ■クライアント側設定 キーの発行 [root@CentOS7-C ~]# ssh-keygen -t rsa パーミッション設定 [root@CentOS7-C ~]# chmod 700 /root/.ssh [root@CentOS7-C ~]# chmod 600 /root/.ssh/* キーファイルをサーバー側に送る [root@CentOS7-C ~]# rsync -av -e ssh /root/.ssh root@172.16.0.202:/root/.ssh/from172.16.0.201 この時は手動でパスワード入力 ■サーバー側設定 クライアントからのキーファイルを別名で保存 [root@CentOS7-S ~]# cp /root/.ssh/from172.16.0.201/.ssh/id_rsa.pub /root/.ssh/authorized_keys キーファイルのパーミッション設定 [root@CentOS7-S ~]# chmod 600 /root/.ssh/authorized_keys ■クライアント側から接続 [root@CentOS7-C ~]# ssh root@172.16.0.202 Enter passphrase for key '/root/.ssh/id_rsa': 成功していればパスワードを聞かれずにログイン。 しかし、失敗しているので、パスワードを要求されている。 <考察> クライアントで生成したキーをサーバーにリモートコピーするだけなのに上手く行かない。 シンプルな話、 クライアントの /root/.ssh/id_rsa.pub と サーバーの /root/.ssh/authorized_keys が 同じであれば成立するというだけの話に思えるが、 クライアントでのcat /root/.ssh/id_rsa.pub と サーバーでのcat /root/.ssh/authorized_keys を見比べても全く同じなのに上手く行きません。 何が悪いのでしょうか?