Brazilian forward Neymar scored twice for the home side, including a penalty, with fellow striker Luis Suarez toe-poking in on the hour mark.
Roma picked up their first win of the group stages with a 3-2 victory against Bundesliga side Bayer Leverkusen.
Mohamed Salah and Edin Dzeko were both on target for the Italians.
Admir Mehmedi and Javier Hernandez had drawn Leverkusen level after trailing 2-0 at the break, but Bosnian Miralem Pjanic struck a winning penalty with 10 minutes remaining.
Barcelona have won three and drawn one of their four games as they look to become the first club since AC Milan in 1990 to defend their title.
“I am happy with the game. They barely caused any danger and it was a just result,” said Barca head coach Luis Enrique.
“There are lots of positives as it is never easy to win in the Champions League. We want to finish top of the group and we have to beat Roma and go from there.”
One 100% record remaining
Russian side Zenit St Petersburg are the only team left in the competition with a 100% record after beating Lyon 2-0 in France. Striker Artyom Dzyuba scored twice for Andre Villas Boas’s men who have qualified for the knockout stages.
The other game in Group H ended in a shock result as Belgian side Gent recorded their first Champions League win with a 1-0 triumph over the 2000 and 2001 runners-up Valencia.
Porto maintained their unbeaten record in Group G, as goals from Cristian Tello, Andre Andre and Miguel Layun gave them a 3-1 victory over the pointless Maccabi Tel Aviv.