루트가 아닌 사용자로 Docker 컨테이너를 시작하고 ssh를 통해 액세스할 수 있기를 원합니다. sshd를 루트로 시작하면 로그인할 수 있습니다. 다른 사용자로 컨테이너를 시작하도록 전환한 다음 해당 사용자로 SSH를 시도하면 "모든 주소를 바인딩할 수 없습니다"라는 오류가 발생합니다. 및 "포트 22에 바인딩::실패: 권한이 거부되었습니다."
다른 사용자에게 루트 권한을 부여했지만 여전히 작동하지 않습니다.
저는 이 작업을 Alpine Linux에서 작동시키고 이를 Fargate 작업으로 사용하려고 합니다. Fargate가 처음 컨테이너에 연결되면 배후에서 인증 키 파일에 입력되는 공개 키가 즉시 전달됩니다. 또한 실패할 경우를 대비해 Fargate에 다른 사용자로 SSH를 연결했는지 확인했습니다. 아래 예에서는 ernie로 설정했습니다. 아래 파일에서 사용자를 루트로 설정하고 루트를 사용자로 사용하도록 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