Me gustaría saber si es posible para un usuario no root en Linux (estoy usando openSUSE) ejecutar Apache sin usar el comando sudo. Tenga en cuenta que el usuario está en el mismo grupo que apache (wwwrun).
Gracias de antemano.¿Hay alguna manera de iniciar/reiniciar/detener el servidor Apache en Linux como usuario no root?
Respuesta
Los problemas señalados anteriormente por benlumley, es decir, archivos de registro y puertos reservados, pueden superarse fácilmente configurando el directorio de registro y el puerto en su httpd.conf.
No hay forma de evitar las limitaciones de acceso a los puertos privilegiados sin acceso privilegiado. – kmkaplan
"Configurar el ... puerto en su httpd.conf" es una forma de evitar las limitaciones de acceso a los puertos privilegiados, ya que puede elegir un puerto sin privilegios para escuchar. –
Oh, vale, no me había dado cuenta de que un puerto no estándar sería perfecto para el Día. – kmkaplan
Los dos problemas que se me ocurre que se necesita para superar son:
permisos en los archivos de registro - estos también pueden estar ya preparado para permitir la wwwrun para acceder a ellos, pero su a menudo un problema.
Usuario no root que accede a un puerto con privilegios (80): no estoy seguro de/cómo puede cambiar esto.
Puede ejecutar Apache como cualquier otro usuario. Solo asegúrese de que esté configurado para usar solo los recursos permitidos (directorios, archivos y lo más importante, escuchar en un puerto no privilegiado).
Para que aparezca en el puerto estándar 80 de HTTP (que está privilegiado) deberá configurar, como root una redirección a su servidor Apache real. La forma más fácil es probablemente usar iptables. Por ejemplo, si el servidor Apache está escuchando en el puerto 8080:
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -j REDIRECT --to-port 8080
Si no puede configurar el servidor de esta manera (o que su administrador de sistemas puede hacer que una vez por todas), tendrá que utilizar un puerto no privilegiado (algo como Listen 8080
) y acceder a ella mediante una dirección URL que se parece a http://www.example.com:8080/
El problema es que no puedo convertirme en root, así que estoy buscando una forma de superar todo lo que se debe hacer como root. Pero gracias por tu respuesta. – Adriana
Creo que debería ser capaz de hacer esto mediante la concesión de acceso de ejecución al grupo al que pertenece el programa de control de Apache (por ejemplo, "chmod g + x apachectl"). Si esto no funciona solo, intente también configurar el bit SUID del propietario en el programa (algo similar a "chmod u + s apachectl").
El primer paso permite a los usuarios de su grupo wwwrun ejecutar el programa apachectl. El segundo paso hace que cuando el grupo ejecuta el programa, se ejecute con los privilegios de propietarios del programa.
Avíseme si esto funciona, estoy un poco oxidado con la ejecución de archivos SUID, pero puedo ayudar a investigar más si todavía tiene problemas.
Sin embargo, asegúrese de entender las consecuencias de configurar el bit SUID antes de hacer esto.
Respuesta corta: No
La razón para ello es que sólo root puede obligar a los puertos por debajo de 1024.
Respuesta larga: consulta http://www.debian-administration.org/articles/386
Una vez que superar el problema con los puertos, lo no pienses que habrá más problemas. Solo recuerda que el usuario al que se ejecuta apache necesita tener acceso de escritura a los archivos de registro y tal vez también a otros archivos.
Sin embargo, si lo ejecuta sin sudo, el generador probablemente no podrá cambiar el usuario, por lo que apache se ejecutará como el usuario que lo inicia, en lugar del usuario de apache.
¿Pero cuál es la razón por la que no desea ejecutar sudo?Solo el proceso de generación se está ejecutando como raíz, el resto se está ejecutando bajo el usuario apache.
Puede "setuid" para permitir que los usuarios no root ejecuten apachectl como root (sin tener que autenticarse como root).
Editar: hay que mencionar que necesita acceso root para configurar esto en el primer lugar :-)
Pensé lo mismo.Intenté y no vuela. (13) Permiso denegado: make_sock: no se pudo vincular a la dirección [::]: 80 (13) Permiso denegado: make_sock: no se pudo vincular a la dirección 0.0.0.0:80 –
Mi error - Generalmente, setuid se ignora para los scripts de shell (por razones de seguridad). Echa un vistazo a la respuesta de Emanuel. – Nick
La respuesta de Emanuel vuela. –
Si ha instalado sudo puede crear un archivo: /etc/suduers.d/apache2reload con el siguiente contenido:
username ALL=NOPASSWD:/usr/bin/service apache2 reload
No haría eso. No puedo entender por qué tanta gente publicó esta opción. Por defecto, una vez que haces el comando sudo, no tienes que ingresar la contraseña para ejecutar otro comando sudo, dándoles acceso libre a la raíz. – dtc
Esto no fue "predeterminado" en los dos sistemas que acabo de probar (Ubuntu 14.04, SLES 11) - vale la pena comprobarlo usted mismo. – Nick
Esta es la respuesta correcta. Cambiar el usuario que apache se ejecuta como (que de todos modos no es raíz) no hace la diferencia. La objeción de @dtc se basa en un malentendido acerca de cómo funciona el sudoers conf. – jwg
puede ver sus privilegios con sudo -l, desde aquí se puede encontrar que usted tiene acceso al comando de reinicio, pero tal vez no iniciar o parar.
Algunos enlaces que encontré dieron la respuesta más beneficiosa para esto. Técnicamente, todavía está actuando como root pero puedes modificar los archivos apache2 y apache2ctl (si también usas el segundo) para cargar archivos. Esto le permite ejecutarlos con acceso raíz pero seguir siendo de un usuario que tiene los mismos permisos, manteniendo la seguridad intacta (a menos que apache o apache2ctl fueran más locos, lo que dudo que sean).
puede utilizar para ejecutar el supervisor de Apache
Si no quieren dar a conocer el acceso sudo, también puede crear un programa envoltorio setuid. Por ejemplo:
httpdctrl.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <strings.h>
// allow start/stop/restart of apache by non-root users
int main(int argc, char **argv)
{
char *cmd, *cmd2, *usage;
// UPDATE THIS LINE:
cmd = "/your/path/to/httpd/sbin/apachectl";
cmd2 = "apachectl";
usage = "Usage: COMMAND [start|stop|restart]\n";
if (argc != 2) {
printf(usage);
exit(1);
}
setegid(0);
seteuid(0);
setgid(0);
setuid(0);
if (strncmp(argv[1], "start", 5) == 0) {
if (execl(cmd, cmd2, "start", (char*)0) < 0) {
perror("Error");
}
} else if (strncmp(argv[1], "stop", 4) == 0) {
if (execl(cmd, cmd2, "stop", (char*)0) < 0) {
perror("Error");
}
} else if (strncmp(argv[1], "restart", 7) == 0) {
if (execl(cmd, cmd2, "restart", (char*)0) < 0) {
perror("Error");
}
} else {
printf(usage);
exit(1);
}
exit(0);
}
actualizar la ruta en:
// UPDATE THIS LINE:
cmd = "/your/path/to/httpd/sbin/apachectl";
A continuación, compilar y cambiar permisions con
gcc -o httpdctrl httpdctrl.c
sudo chown root:root httpdctrl
sudo chmod u+s httpdctrl
Ahora el httpdctrl es propiedad de root, y setuid lo ejecutará como raíz.
IMPORTANTE: Asegúrese de que el script de inicio/detención y todos los directorios principales también son propiedad de root. También elimine el acceso de escritura a archivos y directorios para 'otros'. Básicamente, no desea que alguien pueda editar o cambiar los directorios/archivos que se ejecutan con la raíz.
- 1. ¿Hay alguna manera de instalar solo el cliente mysql (Linux)?
- 2. ¿Hay alguna manera de inspeccionar el rpath actual en Linux?
- 3. ¿Hay alguna manera de descompilar Linux .so?
- 4. ¿Cómo puedo "otorgar crear usuario" como usuario no root?
- 5. ¿Cómo ejecutar el servidor de aplicaciones de python/python como usuario no root?
- 6. ¿Hay alguna manera de crear una señal definida por el usuario en Linux?
- 7. ¿Hay alguna manera de obtener el UID del usuario en la máquina Linux usando Java?
- 8. ¿Hay alguna manera de reescribir if/else en Apache htaccess?
- 9. En ColdFusion, ¿hay alguna manera de determinar en qué servidor se está ejecutando el código?
- 10. ¿Hay alguna manera de usar java.util.Preferences en Windows sin usar el Registro como servidor?
- 11. ¿Hay alguna forma de abrir el archivo con emacsclient (usuario) pero con permiso de root?
- 12. ¿Hay alguna manera de que Apache log logre slow requests?
- 13. ¿Hay alguna manera de controlar Apache con New Relic?
- 14. Ejecutar Silverlight con servidor Apache (en Linux)
- 15. Obtener el usuario de apache linux de php
- 16. ¿Hay alguna manera de omitir el parámetro?
- 17. Instalación de Git con cuenta de usuario no root
- 18. Ejecutar el proceso como usuario actual de Mac OS X, no como root
- 19. La mejor manera de sandbox Apache en Linux
- 20. Instalar Clang como usuario (sin privilegios de root)?
- 21. ¿Hay alguna manera de hacer algo como esto en C#?
- 22. ¿Hay alguna manera de determinar si un PID de Linux está en pausa o no?
- 23. ¿Cómo instalar MySQL 5.5 utilizando Source desde un usuario de Linux no root?
- 24. PHP: ¿hay alguna manera de ver caracteres "invisibles" como \ n
- 25. ¿Qué usuario está ejecutando Apache como en Windows?
- 26. ¿Hay alguna manera de pasar métodos como bloques?
- 27. ¿Cómo reinicio programaticamente un servicio de sistema (no apache) de apache en Linux?
- 28. autenticación en el script de Python para ejecutar como root
- 29. ¿Hay alguna manera de que pueda cambiar el orden de carga de Apache VirtualHosts primero?
- 30. Servidor Apache como proxy para el problema de Jboss
SI sabía que iba a responder, pero en su lugar te diré que esta no es una pregunta de programación :) En serio, sin embargo, no sé la respuesta. Es una gran pregunta, de hecho. –
Gracias y sí, no estaba seguro de si esta pregunta encaja en la programación, sin embargo, lo intenté :). – Adriana
Podría decirse que está relacionado con la programación, ya que la razón más común para querer hacer esto, en mi experiencia, es para que un programador pueda reiniciar apache más fácilmente en su caja de desarrollo. –