LoginSignup
5
3

More than 5 years have passed since last update.

ポートフォリオを作り始めた

Last updated at Posted at 2018-03-03

ポートフォリオを作り始めた(備忘録的な)

久しぶりの投稿です。ポートフォリオサイトを作り始めました。
こんな感じの。

ポートフォリオ
(github)

まだやっと原型が完成したなーって感じです(2018/3/3時点)。
苦労した点とかまとめて行きます。

構成

サーバ側は全てRustで書いています。RocketというWebフレームワークを使いました。
フロントは普通にJS。

ターミナル形式のかっこいいサイト作りました。
コマンドは全て鯖側で処理します。

苦労した点その1 Rust

Rustがまだよくわからない、色々と作ったりしてるんですが、Rustの掟にしたがって書けているのか、いまいちわからない。文字列処理らへんが特にわかってない気がする。真面目に調査をする必要があるなぁ...

軽く解説 &str と String

(途中)

Rustには&strとStringの二つの文字列型がある。

参考String vs &str in Rust functions

苦労した点その2 JSの非同期処理

Promise、最初はわからなかったんですが、素晴らしいですねこれ。
コードの形で処理順がわかるので、以前(コールバック地獄の時代)と比べるとかなり読みやすいし、作るのも楽ですね。

// get response
        post_ajax_call("/api/ajax/post_do_command", command).then((result) => {
                console.log(result);
                type_elm.innerHTML += "<br>" + result;
                console.log(type_elm.innerHTML);

                // scroll bottom
                bottom.scrollIntoView(true);
                return post_ajax_call("/api/ajax/post_pre_prompt", "");
            })
            .then((result) => {
                pre_prompt_text = result;

                // create element
                var new_now_line = document.createElement("span");
                new_now_line.id = "now_line";
                new_now_line.innerHTML = pre_prompt_layout.replace(/\#\#\#/g, pre_prompt_text);

                // add element
                type_elm.parentNode.insertBefore(new_now_line, type_elm.nextSibling);

                // remove element
                type_elm.removeAttribute("id");

            })
            .catch((err) => {
                console.log("error: " + err);
            })

thenの中のアロー関数でPromiseを返してるのがポイント。
そこでまたthenを呼んで、同期処理を書いていきます。

苦労した点その3 サーバの権限設定

擬似SSHは完成したが、任意のコマンドが実行できる状態だった。それはかなりまずい...
だってこんなコマンドが実行できちゃう。
sudo rm -rf /
こんなのも
:(){:|:&};:

流石にまずいので、権限に制限を設けたユーザを作成した。でもどこかに漏れがありそう。何か発見した人はぜひ教えていただきたい...😢

rbashを用いて権限を絞ってたんですが、systemdを導入したらうまく動かなくなってしまいました...
ですから、代わりにchroot環境を導入しました。

軽く解説 超権限を絞ったユーザの作り方とプログラムの実行(chroot環境)

(途中)

軽く解説 超権限を絞ったユーザの作り方とプログラムの実行(rbash環境)

  • 権限を絞ったguestユーザを作る
  • コマンドの実行権限をguestユーザにする

上の二つが実現できれば、root権限には触れらない制限された環境が作れそう。

とういことで、ググってたら、以下を発見。

rbashで一部のユーザが実行できるコマンドを制限する(特定コマンドしか実行できないようにする)

発見したリンクを参考に以下の作業を行なった。

  1. /opt/binにrbashのシンボリックリンクを作ってあげる
    • ln -s /bin/bash /opt/bin/rbash
  2. rbashを起動シェルとしたユーザguestを作成
    • useradd -m -s /opt/bin/rbash
    • passwd guestでパスワードを付与
  3. /opt/bin/guestにguestが使えるコマンドをシンボリックリンクで置いてあげる
    • ln -s /bin/ls /opt/bin/guestみたいな感じ
  4. .bashrcに`export PATH="/opt/bin/guest"'に書き込む

上記作業後login guestでguestにログインしたら、ガッチガチに固められたguestユーザを作成できた。
guestでwebサーバを実行することで、コマンドにも制限をつけることができた。

今回ポートフォリオを作りはじめて、rbashについて初めて知った。以下、rbashの備忘録的なものを残しておきます。

rbash

rbashとはbashに制限をつけたシェルのこと。bashと比べて以下のような制限がある。

  • cdできない
  • 環境変数を変更できない
  • /を含むコマンドを実行できない(引数には取れる)
  • リダイレクトできない(そもそも今回の擬似SSHではリダイレクト機能がない)
  • execできない
  • カレントディレクトリで/を含むシェルスクリプトを実行できない
  • 起動時にシェルで定義された関数を実行できない ...などなど

これらの制限は、起動ファイルが読まれた後に施行されるそう。
だから、.bashrcとかは処理してくれる。

ただ、シェルスクリプトを実行されると、rbashの制限が一気に解けちゃうらしい。
そこだけ気をつけていればOKかな...?

参考いますぐ実践! Linux システム管理

5
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3