The olive branch to those demanding greater, or complete, independence from Kiev came as renewed fighting in eastern Ukraine left at least eight people dead and threatened to end an 11-day-old ceasefire.
But the move has been met with a mixture of condemnation and indifference.
Moscow also announced it was sending reinforcements to the Ukrainian region of Crimea, which it annexed earlier this year.
Ukraine president Petro Poroshenko said that the law would enshrine Ukraine’s “territorial integrity” but would also grant “self-government” to the Donetsk and Luhansk regions – the two hotspots of rebel activity – although the law places a three-year limit on what it describes as a “special form of government”.
Further moves include the right to develop “neighbourly relations”, and pledges of economic support.
It also grants amnesties to rebels involved in the fighting except those considered guilty of “serious” crimes such as the shooting down Malaysian Airlines flight MH17.
There was a mixed reaction from rebel leaders after the announcement.
Andrei Purgin, the deputy prime minister of the self-proclaimed Donetsk People’s Republic, said: “This territory no longer has anything to do with Ukraine, Ukraine is free to adopt any law it wants. But we are not planning any federalism with Ukraine.”
However, Igor Plotnitsky, head of the Luhansk separatists, said a “peaceful resolution has been given a chance”. While the concessions may bring fighting to a permanent end, they have come under attack in Kiev, with critics accusing Mr Poroshenko of giving too much to the rebels, who many consider as nothing more than Russian provocateurs who have little significant local support.
Former Ukrainian prime minister Yulia Tymoshenko described the move as a “complete surrender” of Ukraine’s interests.
Ukraine’s prime minister Arseny Yatsenyuk was also unenthusiastic, suggesting that it would do little to stop Russian president Vladimir Putin seizing the whole of the country.
Along with passing the law yesterday, Ukraine’s parliament also ratified an association agreement of political and trade links with the European Union.
“Tell me, who will now dare to shut Ukraine’s doors to Europe?” asked Mr Poroshenko before the unanimous vote by all 355 MPs present. “Who will be against our future membership of the EU, towards which today we are taking our first but very decisive step?”
Former president Viktor Yanukovich’s original refusal to sign the pact in November last year triggered a chain of events that saw mass and bloody demonstrations in Kiev, Mr Yanukovich’s overthrow and the Russian invasion of Crimea.
In an apparent concession to Russia’s wishes, the implementation of a free trade pact included in its provisions has been delayed until the start of 2016.
Russia had expressed concerns that the agreement would lead to its market being flooded with cheap EU goods.
The United Nations has saidthat at least 3,000 people have been killed in the conflict and more than 310,000 internally displaced in Ukraine.
Ukraine and the West have accused Russia of backing the rebels with soldiers and weapons, which the Kremlin denies.