root以外のユーザーとしてDockerコンテナを起動し、sshを介してアクセスできるようにしたいです。 sshdをrootで起動するとログインできます。別のユーザーにコンテナーを起動するように切り替えてからそのユーザーとしてSSHを試みると、「すべてのアドレスをバインドできません」というエラーが発生します。 「ポート22にバインド::失敗:権限が拒否されました。」
他のユーザーにroot権限を与えましたが、まだ機能しません。
私はこのタスクをAlpine Linuxで動作させ、それをFargateタスクとして使用したいと思います。 Fargate が最初にコンテナに接続されると、背後で認証キーファイルに入力された公開キーがすぐに渡されます。また、失敗した場合に備えて、Fargateに他のユーザーとしてSSHを接続したことを確認しました。以下の例ではernieに設定しました。以下のファイルでユーザーをrootに設定し、rootをユーザーとして使用するようにFargateコードを変更すると、コンテナにうまく入ることができます。 Ernieをエラーが発生したユーザーに設定する際に問題があります。
私のDockerfile:
FROM alpine:latest
# Set the name of the user we want to use
ENV LOGINUSER="ernie"
# --------------------------------------------------------------------------------#
# Install and configure sshd.3 #
# https://www.cyberciti.biz/faq/how-to-install-openssh-server-on-alpine-linux-including-docker/ #
# https://docs.docker.com/engine/examples/running_ssh_service for reference. #
# --------------------------------------------------------------------------------#
RUN apk add --no-cache openssh-server bash shadow sudo\
&& mkdir -p /var/run/sshd
RUN adduser --disabled-password --gecos "" $LOGINUSER
# https://ostechnix.com/add-delete-and-grant-sudo-privileges-to-users-in-alpine-linux/
RUN echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel
RUN adduser $LOGINUSER wheel
RUN cat /etc/ssh/sshd_config && echo "AllowUsers $LOGINUSER" >> /etc/ssh/sshd_config
RUN echo "$LOGINUSER ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$LOGINUSER
RUN chmod 0440 /etc/sudoers.d
#RUN echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config
RUN echo 'root:dummy_passwd'|chpasswd
EXPOSE 22
# change ownership of /etc/ssh to the user we want to use
RUN sudo chown -R $LOGINUSER /etc/ssh
RUN sudo chown -R $LOGINUSER /run
####################CREATE CUSTOM SSHD CONFIG ###########################
RUN mkdir /opt/custom_ssh
RUN chmod -R 777 /opt/custom_ssh/
# Need to chown to allow ernie access - remove for root to work again
RUN chown -R $LOGINUSER:$LOGINUSER /opt/custom_ssh
USER $LOGINUSER
RUN ssh-keygen -f /opt/custom_ssh/ssh_host_rsa_key -N '' -t rsa
RUN ssh-keygen -f /opt/custom_ssh/ssh_host_dsa_key -N '' -t dsa
# This creates the keys in
RUN ssh-keygen -A
RUN echo 'Port 22' >> opt/custom_ssh/sshd_config
RUN echo 'AuthorizedKeysFile /opt/custom_ssh/authorized_keys' >> /opt/custom_ssh/sshd_config
RUN echo 'Subsystem sftp /usr/lib/ssh/sftp-server' >> /opt/custom_ssh/sshd_config
RUN echo 'X11Forwarding no' >> /opt/custom_ssh/sshd_config
RUN echo 'GatewayPorts no' >> /opt/custom_ssh/sshd_config
RUN echo 'AllowTcpForwarding no' >> /opt/custom_ssh/sshd_config
RUN echo 'StrictModes no' >> /opt/custom_ssh/sshd_config
RUN echo 'PubkeyAcceptedKeyTypes +ssh-rsa' >> /opt/custom_ssh/sshd_config
RUN echo 'PubkeyAuthentication yes' >> /opt/custom_ssh/sshd_config
RUN chmod 644 /opt/custom_ssh/sshd_config
USER $LOGINUSER
ENTRYPOINT ["/docker-entrypoint.sh"]
私のdocker-entrypoint.shファイル
#!/bin/sh
# Needed for Fargate connection
setUpSSH() {
echo "DEBUG - I am in the setUpSSh function"
echo "DEBUG - the public key passed in is $$SSH_PUBLIC_KEY"
# Block the container to start without an SSH public key.
if [ -z "$SSH_PUBLIC_KEY" ]; then
echo 'Need your SSH public key as the SSH_PUBLIC_KEY environment variable.'
exit 1
fi
# Create a folder to store user's SSH keys if it does not exist.
USER_SSH_KEYS_FOLDER=/opt/custom_ssh
[ ! -d ${USER_SSH_KEYS_FOLDER} ] && mkdir -p ${USER_SSH_KEYS_FOLDER}
# Copy contents from the `SSH_PUBLIC_KEY` environment variable
# to the `$USER_SSH_KEYS_FOLDER/authorized_keys` file.
# The environment variable must be set when the container starts.
echo ${SSH_PUBLIC_KEY} > ${USER_SSH_KEYS_FOLDER}/authorized_keys
echo " DEBUG - cat ${USER_SSH_KEYS_FOLDER}/authorized_key"
# Clear the `SSH_PUBLIC_KEY` environment variable.
unset SSH_PUBLIC_KEY
}
setUpSSH
/usr/sbin/sshd -D -e -f /opt/custom_ssh/sshd_config
# Start the SSH daemon
#exec "$@"
ベストアンサー1
ルートのみが1024未満のポートにバインドできます。しかし、SSHデーモンがポート22をリッスンする理由はありません。 1024を超える別のポートでリッスンするように設定できます(このユースケースでは、SSHでは2222が一般的です)。
クライアントが実際にポート22に接続する必要がある場合は、ECSジョブ定義で外部ポート22を内部ポート2222にマップするだけです。ここで「ポートマッピング」を参照してください。https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html