1.
小分段:选择合适厂商(阿里云、腾讯云、AWS 香港、Vultr 香港等),挑选提供学生优惠或低价学生机的实例类型。建议选择至少1核、1GB内存起步,SSD磁盘,版本选择Ubuntu LTS(如22.04)。
小分段:在控制台创建实例时,设置可用区为香港(HK),创建时记下安全组(Security Group)和网络配置(VPC、子网),并绑定公网IP或弹性IP(必要时)。
2.
小分段:在本地生成密钥对:ssh-keygen -t ed25519 -C "student@project";将公钥上传到控制台或使用ssh-copy-id user@ip。确保实例的~/.ssh/authorized_keys权限为600。
小分段:在/etc/ssh/sshd_config中配置:PermitRootLogin no、PasswordAuthentication no、PubkeyAuthentication yes、PermitEmptyPasswords no。重启SSH:sudo systemctl restart sshd。测试新的连接后再断开原有会话。
3.
小分段:添加用户并设置sudo:sudo adduser student1;sudo usermod -aG sudo student1。不要直接给学生全部sudo权限,使用visudo创建别名或限定命令,例如允许重启服务和查看日志:
小分段:在visudo中添加例子:Cmnd_Alias PROJECTCMDS = /bin/systemctl restart project.service, /bin/journalctl -u project.service;然后 student1 ALL=(ALL) NOPASSWD: PROJECTCMDS。这样避免授予全root。
4.
小分段:先在云控制台安全组只开放必要端口(SSH 22 或自定义端口、HTTP 80、HTTPS 443、应用端口内网开放)。
小分段:在服务器启用UFW:sudo apt install ufw -y;sudo ufw default deny incoming;sudo ufw default allow outgoing;sudo ufw allow proto tcp from any to any port 22 comment 'ssh';sudo ufw allow 80,443/tcp;sudo ufw enable。若更改SSH端口,先添加新规则再移除22。
5.
小分段:安装fail2ban:sudo apt install fail2ban -y。创建本地配置/etc/fail2ban/jail.d/defaults-debian.local,配置[sshd]区,设置maxretry=5、bantime=3600,并启用logpath。重启服务:sudo systemctl restart fail2ban。
小分段:可配合更换SSH端口、限制root登录、使用AllowUsers仅允许特定用户登录。
6.
小分段:如果使用 systemd 管理项目,创建 /etc/systemd/system/project.service,指定 User=projectuser、Group=projectgroup、PrivateTmp=yes、ProtectHome=yes、NoNewPrivileges=yes,限制能访问的资源。
小分段:示例 service 要点:ExecStart=/usr/bin/gunicorn -b unix:/run/project.sock wsgi:app;然后 sudo systemctl daemon-reload;sudo systemctl enable --now project.service。若使用 Docker,可用 --user 指定 uid,或使用 rootless 模式并启用 --cap-drop 限制能力。
7.
小分段:为项目创建专有用户组:sudo groupadd projectgroup;sudo useradd -M -s /usr/sbin/nologin projectuser;sudo chown -R projectuser:projectgroup /srv/project。
小分段:设置权限:sudo chmod -R 750 /srv/project;对需要写入的目录(logs、uploads)设置setfacl:sudo setfacl -R -m g:projectgroup:rwx /srv/project/uploads;保证web服务器(如www-data)通过组或额外授权访问。
8.
小分段:安装Nginx并配置server块,使用proxy_pass或unix socket连接后端。示例:location / { proxy_pass http://unix:/run/project.sock; proxy_set_header Host $host; }
小分段:使用certbot获取Let's Encrypt证书:sudo apt install certbot python3-certbot-nginx -y;sudo certbot --nginx -d yourdomain.hk。证书自动续期通过系统Cron或systemd-timer完成。
9.
小分段:如果需要给学生上传代码但不允许shell,配置sshd_config的ChrootDirectory并创建sftp-only用户组。示例配置:
Match Group sftpusers ChrootDirectory /home/%u ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no
小分段:注意ChrootDirectory目录必须归root所有且权限为755,上传目录放在子目录(如/home/user/projectdata)并调整所属与权限。
10.
小分段:安装并配置auditd记录关键文件改动与sudo使用:sudo apt install auditd -y;在/etc/audit/rules.d/添加规则,如-w /etc/sudoers -p wa -k sudoers_changes。
小分段:备份采用自动化脚本:rsync -a --delete /srv/project/ backup@backupserver:/backups/project/,或定期在云控制台使用磁盘快照。保留最近7份,测试恢复流程。
11.
问题:如何在香港云学生机上限制学生权限,防止误改系统或读取其它项目数据?
回答:采用最小权限原则:每个项目创建独立系统用户和组,使用chown/chmod与setfacl分配文件权限;通过visudo限制sudo命令集合;使用SFTP chroot限制文件上传范围;若需运行应用,用systemd指定User=projectuser及ProtectHome/NoNewPrivileges等;必要时用容器(Docker)或轻量虚拟化隔离不同学生环境。
12.
问题:如何设置数据库(如PostgreSQL/MySQL)只允许项目访问而不暴露到公网?
回答:在数据库配置中bind地址设置为127.0.0.1或内网IP;数据库用户与权限按库/表粒度授予;在云安全组与UFW中只允许来自应用服务器的私有子网访问数据库端口;若多人共享同一实例,建议使用socket或本地数据库实例并使用不同数据库用户、强密码与定期审计。
13.
问题:学生项目上线后,怎样保证系统持续更新与安全?
回答:设置定期安全更新(sudo unattended-upgrades),建立补丁管理流程:先在测试实例验证后再在生产实例应用;开启基础监控(CPU、内存、磁盘、异常登录)并配置告警;定期查看fail2ban、auditd和应用日志;对重要服务启用自动重启策略与快速回滚(快照/镜像);最后做好备份与恢复演练。